에 해당하는 글 12

  1. @Conditional 2025.03.21

    보호되어 있는 글입니다.


  2. [Gradle] --project-prop 옵션으로 특정 파일 제외하여 빌드하기 2025.03.07

    이번에 Swagger를 활용해 API 문서를 작성하면서,개발 서버에서만 쓰이는 내부용 컨트롤러에 아예 접근할 수 없도록 처리할 필요가 있었다. @Hidden, @Profile 등 여러 방법을 찾아 보다 gradle로 아예 파일 자체를 빼고 빌드하기로 했다. https://docs.gradle.org/current/userguide/command_line_interface.html#sec:environment_options Command-Line Interface ReferenceGradle provides several built-in tasks which show particular details of your build. This can be useful for understanding your bu..


  3. 프로파일별로 다른 파일이 실행되도록 세팅하기 2024.08.02

    백엔드를 만들 때, 프로파일을 나눠 빌드시 설정한 프로파일에 따라 기능을 제한해야 하는 경우가 있다.예를 들어, 어떤 편의 기능은 좀 더 상위 프로파일에서만 지원되게 한다던가,같은 메서드를 사용해도 프로파일에 따라 로직이 달라지는 경우가 있을 수 있다. 이런 부분을 구현하기에 앞서 먼저 기본적인 테스트를 해 봤다.어떤 Service에 대한 인터페이스를 두고 각 프로파일별로 구현한 다음,설정된 프로파일에 따라 각 구현된 Service 내의 메서드가 실행되도록 하려 한다. 우선 폴더 구조는 아래와 같이 설정했다.core에 구현할 서비스의 Test 인터페이스를 생성하고, 프로파일의 이름으로 된 디렉토리 내에서 구현할 예정이다.  package com.example.demo.core;public interfac..


  4. *.properties 내 값 enum 클래스로 받아 관리하기 2024.07.26

    지금까지는 서버가 작동되는 환경에 대한 상수를 단순히 String으로만 관리해 왔다.플랫폼 서버 개선을 진행하면서 properties로 해당 환경변수를 받고,또 해당 상수를 서버 내부에 enum으로 관리하여 사용할 수 있는 값을 한정하도록 설정했다. 1. enum 클래스 생성package kr.doodoo.common;public enum ServerMode { WINDOW("WINDOW"), MAC("MAC"), ETC("ETC"); private String mode; ServerMode(String mode) { this.mode = mode; } public String getMode() { return this.mode; } ..


  5. debounce 검색 바 만들기, ReturnType 2024.05.21

    검색용 컴포넌트를 구현함에 있어서, 타자를 칠 때마다 API를 날려 매번 DB를 조회하기보다는입력 후 지연시간을 두어 검색 API를 날릴 수 있도록 했다. 전체 코드import React, { useState, useEffect } from 'react';const SearchComponent = () => { const [searchTerm, setSearchTerm] = useState(''); const [searchResults, setSearchResults] = useState([]); const [timeoutId, setTimeoutId] = useState | null>(null); const fetchSearchResults = async (term: string) => { ..


  6. 알림서비스를 위해 웹소켓 통신을 rabbitMQ로 대체하기 2024.04.22

    전제 조건- 웹소켓 서버에 알림을 발송하는 REST API가 존재함- 여러 개의 클라이언트와 웹소켓 서버가 연결되어 있음- 백엔드 서버도 클라이언트와 같은 방식으로 웹소켓 서버와 연결되어 있음 웹소켓은 양방향 통신이 가능한 프로토콜.실시간성이 엄청 중요한 알림이 아니었기 때문에 굳이 웹소켓을 사용할 필요는 없다. 알림을 발송할 때 필요한 것1. (타겟 유저의 클라이언트가 켜져 있다면) 유저 클라이언트에게 알림을 보낸다.2. 데이터베이스에 알림 이력을 쌓는다. 이러나 저러나 알림 이력을 쌓을거라면 무조건 알림도 보내고 이력도 쌓으면 되지 않나?어차피 API는 이미 만들어져 있으니.. 클라이언트가 꺼져 있다면 알림은 도착하지 않고 재로그인시 n건의 알림이 있다고 알려줄 거니까. 어떤 이유로 잠시 웹소켓이 꺼..


  7. 커스텀 프로토콜로 일렉트론 클라이언트 실행시키기 2024.04.09

    목적 일렉트론으로 빌드한 A,B 클라이언트가 있다고 하자. 커스텀 프로토콜을 활용하여 A 클라이언트 내에서 로그인 후 특정 버튼을 클릭하면, B 클라이언트가 실행되면서 A에서 로그인한 정보까지 넘겨주려고 한다. 슬랙 웹페이지에서 슬랙 애플리케이션을 실행시켜 주듯이... 거기다 특정 페이지로 이동까지 시키는 등 다양한 액션이 필요할 수 있다. 우선! windowsOS와 macOS가 각각 작동하는 방식이 다르기 때문에.. 여기저기서 쿠키를 등록할 수 있으므로 같은 코드 반복을 방지하기 위해 관련 처리 함수를 만든다. const setCookie = async (key: string, value: string) => { session.defaultSession.cookies.set({ domain: ".doo..


  8. 일렉트론 로그 확인하기 2024.04.09

    일렉트론으로 만든 클라이언트를 디버깅할 때 console.log로 찍은 메시지가 클라이언트의 개발자 도구에서 항상 보이지는 않는다. 왜냐하면, 일렉트론에는 메인 프로세스와 렌더러 프로세스가 있고 console.log는 각 프로세스별로 실행되기 때문이다.메인 프로세스는 애플리케이션의 생명 주기를 제어하고, 렌더러 프로세스는 웹 페이지를 렌더링한다.따라서 콘솔을 어디서 찍었느냐에 따라 개발자 도구로 확인이 불가할 수 있다. 메인 프로세스에서 콘솔을 찍으면 (VSCode에서 실행한 경우) VSCode의 터미널에서 확인이 가능하고,렌더러 프로세스에서 콘솔을 찍으면 실행된 애플리케이션의 개발자 도구에서 확인이 가능하다. 그럼 VSCode가 아니라 빌드한 애플리케이션을 따로 실행한 경우에는 메인 프로세스의 콘솔을 ..


  9. 도커 삽질 기록 2024.03.19

    회사에서 로컬로 테스트를 진행할 때, 준비되어야 할 서버(DB, nginx 등)가 많아서 도커로 관리하고 있었다. 이번에 파이썬으로 실행하는 프로그램도 하나 추가돼서, 원래는 도커를 켜 주고 파이썬은 로컬 컴퓨터에서 파이참으로 프로그램을 켜야 했다. 파이썬 서버를 기존 도커 서비스에 추가해서 합쳐 만들려고 했다! 1. 우분투 이미지를 가져와서 생성한 컨테이너에, rabbitMQ와 파이썬을 설치하고 프로그램을 실행하는 이미지를 .tar로 추출해서 기존에 세팅된 서버 도커에 이미지로 불러와 함께 실행 이미지, 컨테이너, 도커파일, docker-compose 등이 뭔지 도커에 대해 기본적인 정보를 익힌 후 Dockerfile을 만들기 시작했다. 우분투 컨테이너를 베이스로 시작함 rabbitMQ설치와 파이썬 설..


  10. 도커(Docker) 기본개념 2024.03.12

    도커란? Go로 개발된, 앱을 개발하고 배포하고 운영하기 위한 오픈 플랫폼이다. 인프라로부터 앱을 분리하여 소프트웨어를 빠르게 제공할 수 있도록 한다. 도커를 이용하면 앱을 관리하는 것과 같은 방식으로 인프라를 관리할 수 있다. 컨테이너? Runnable instance of an Image, an isolated environment for your code. 앱이 구동되는 환경까지 포함하여 실행할 수 있도록 하는 기술이다. 도커API 또는 CLI를 이용해 생성하고, 실행하고, 중단하고, 옮기거나, 삭제할 수 있다. 컨테이너는 가볍고, 앱을 실행하기 위한 모든 필요한 것을 가지고 있어 호스트에 설치된 것에 의존할 필요가 없다. 이처럼 느슨하게 분리된 환경에서 앱을 패키징하고 실행할 수 있도록 해 준다...