TIL에 해당하는 글 39

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

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


  2. Execution failed for task ':compileJava'. 2024.07.29

    Execution failed for task ':compileJava'.> Could not resolve all files for configuration ':compileClasspath'. > Could not find org.mybatis.spring.boot:mybatis-spring-boot-starter:. Required by: project :Possible solution: - Declare repository providing the artifact, see the documentation at https://docs.gradle.org/current/userguide/declaring_repositories.html build.gradle이나 pom.xml..


  3. [SpringBoot] *.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; } ..


  4. javax.management.InstanceNotFoundException: org.springframework.boot:type=Admin,name=SpringApplication (feat.JMX의 역할) 2024.07.23

    이번에 Spring framework로 구성되어 있던 기존 서비스를 Spring Boot로 올리면서 우여곡절을 많이 겪고 있다.Boot로 올린 후 테스트삼아 서버를 켜봤는데, 아래와 같은 에러메시지가 떴다.javax.management.InstanceNotFoundException: org.springframework.boot:type=Admin,name=SpringApplication at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getMBean(DefaultMBeanServerInterceptor.java:1095) ~[na:1.8.0_161] at com.sun.jmx.interceptor.DefaultMBeanServerInterc..


  5. mybatis xml파일 내 if문에서 단일 문자로 비교되지 않는 문제 2024.07.16

    주어진 state에 따라 WHERE절 내 조건이 변경되는 쿼리를 작성할 일이 있었다.그래서 아래와 같이 state가 'Q' 일 때 어떤 조건을 추가하도록 작성하고 테스트를 진행했다.... AND start_date IS NULL  근데.. 분명 Q를 state에 넣어주고 테스트를 진행했음에도 if문 내의 조건문이 추가되지 않는 이슈가 있었다.원인을 찾아 보니, 작은 따옴표(') 사이에 하나의 문자만 넣으면 string이 아닌 char로 인식하여 숫자로 변환해 버린다.즉, 저 코드로는 숫자 81로 비교가 되고 있는 것이다...   그래서 어떻게 하면 의도대로 작동하는가?작은 따옴표(') 대신 큰따옴표(")를 사용하면 바로 해결된다. ... ..


  6. 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) => { ..


  7. JSON.parse한 Object 내 프로퍼티가 undefined로 나오는 경우 2024.04.24

    빠른 결론JSON.parse 두번 하거나 정규식으로 이스케이프 문자를 제거하면 된다.  JSON을 문자열화한 값을 서버에서 받아서 프론트에서는 그 문자열을 파싱해서 사용한다고 하자. const original = "{\"type\":\"test\",\"content\":{\"title\":\"타 이 틀\",\"content\":\"내용\"}}";const parsedData = JSON.parse(original); console.log(parsedData); // {"type":"test", "content":{"title":"타이틀", "content":"내용"}}console.log(parsedData.type); // undefined 위처럼 코드를 작성했는데 parsedDat..


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

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


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

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


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

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