Backend/SpringBoot 60

yaml 이나 env 에서 설정값 가져오기

민감정보 등 은 env 파일에 따로 빼놓고, git에는 올리지 않는다. yaml을 통해 스프링부트 세부 설정을 할 수 있다.코드레벨 혹은 yaml 에서 env 의 설정값을 가져와야 하는 경우가 있다. 1. @Value 어노테이션을 사용타입이 반드시 일치해야 한다. 그렇지 않으면 오류 난다yaml 혹은 properties의 server.url = 값 으로 명시한 값을 가져오기"${..}" 는 값을 가져다 쓴다는 의미...@Value("${server.url}")private String url;...//생성자 주입 - 가장 권장됨public testClass(@Value("${server.url}) String value){ this.value = value;}...//기본값 설정 가능 값이 없으면 lo..

Backend/SpringBoot 2025.09.03

설정(Configuration) 오버라이딩 하기

사용하다 보면, 실제 서버와 개발서버 별 각각 설정을 달리 해야 할 때가 있다. 대표적인것이 Security가 될 것이다. 간단하게는 yaml 에 exclude를 이용해 처리를 할 수도 있겠으나, 왠지 모르게 실행을 하면 오류가 발생하였다. 물론 오류를 찾아서 해결하는게 가장 베스트 세팅일것으로 생각 된다. 그러나 세부적으로 코드에서 설정을 오버라이딩 하는게 필요할 수도 있다. 아래의 예는 Security를 사용하나, dev 환경에서는 모든 request를 허용하는 세팅으로 바꾸는 것이다.@Configuration@Profile("dev")public class SecurityConfig { @Bean public SecurityFilterChain filterChain(HttpSecurit..

Backend/SpringBoot 2025.09.02

커스텀 Event 발생 -> 수신

예전에 C# 으로 개발할 때 종종 사용하던 방식이었다. 이후 delegate 나 콜백 활용으로 잘 쓰지는 않았지만, 스프링부트에도 해당 기능이 있기에 사용 할 수 있을때를 대비해 내용을 정리해 둔다. 1. 이벤트 객체 클래스 생성맴버변수는 private final 이어야 한다.getter 만 있어야 한다public class TestEventArgs{ private final String arg1; private final Integer arg2; ... public TestEventArgs(String a1, Integer a2) { arg1 = a1; arg2 = a2; } public String getArg1() { ..

Backend/SpringBoot 2025.09.02

NoSQL DB 사용

mysql이나 오라클 같은 전통적인 RDBMS도 사용하지만, NoSQL도 많이 사용하는것 같다. 그 이유를 생각해보면, RDBMS테이블을 미리 생성해야 하고, 컬럼들과 타입을 미리 정의해야 한다. 컬럼 추가 및 변경시 마이그레이션이 필요하다.서버를 여러대 두는 분산처리가 어렵다. 때문에 DB에 문제가 생기면 장애가 발생하기 쉽다데이터 정합성 확보에 좋다 (동시성 처리)금융, 주문, 결제 시스템 등 데이터가 중요한 경우 사용NoSQL보통 Json 또는 key-value 구조로 되어 있어, 정해진 틀에 맞추지 않고 유연하게 저장이 가능하다.분산처리에 최적화 되어 있어 클라우드 환경에 최적화 되어 있다. 일부 서버 장에에도 서비스가 가능하다대용량 데이터, 속도, 확장성, 가용성 위주이다 보니, 일관성이 깨질 ..

Backend/SpringBoot 2025.09.02

시스템 전역에서 핸들링 되지 않은 오류 감지하기

아래에서도 잠깐 설명했는데, C# 을 이용한 프로그램들이나 유니티에서는 Application.UnhandledException 이벤트를 등록함으로서클래스나 함수에서 미처 처리하지 못한 오류가 발생했을때 이를 감지 할 수 있다. 예기치 않게 프로그램이 종료되는것을 막을 수 있을 뿐 아니라, 죽기전에 이용자에게 팝업 등으로 안내를 할 수 도 있고, 로그를 작성할 수도 있다. 스프링부트 (혹은 JVM) 에서 이와 비슷하게 구현하기 위한 방법을 정리해 본다. 다만, 스프링부트와 여타 다른 프로그램과 다른점은, 처리하지 않은 예외가 발생하도 프로그램이 죽지 않는다는 점이다. 프레임워크가 알아서 500 에러를 리턴하고 서버는 계속 동작한다! (톰캣에서 스레드를 생성하여 동작하므로 메인스레드는 살아있다) 1. 스..

Backend/SpringBoot 2025.09.01

생명주기 Event들 활용 하기

생명주기 Event들을 활용해야 할 때가 있다. 예를들어 유니티와 WPF 에서는 어플리케이션이 오류로 죽어 버릴 경우 죽기전에 이벤트를 캐치 하여 임시 파일을 저장한다든지, 로깅을 추가 한다든지 하는 경우가 있었다. 또는 예외처리를 벗어난 예외가 발생하였을때, 로깅을 하고 프로그램을 닫거나 팝업으로 이용자에게 안내를 하는 등 해당 경우가 있다.따라서 생명주기 Event들을 활용방법을 아는것도 중요하다. 일단 이벤트 종류 몇개를 보면, ApplicationStartingEvent (빈 등록 이전, 시작할때 이벤트 발생)ApplicationReadyEvent (빈 등록이 끝나고 모든 초기화 완료시 발생)ApplicationPreparedEvent (빈 등록전 이벤트)ApplicationFailedEven..

Backend/SpringBoot 2025.09.01

AOP 및 Slf4j + logback 로깅

AOP 는 코드의 재사용성을 늘려 중복된 코드를 줄이도록 하는 것으로, Aspect Oriented Programming의 약자이다. 주로 로깅 등 유틸성 기능에서 코드 중복을 줄이기 위해서 사용한다. 특히 로깅, 시간측정 할때. 사실 이 개념을 처음 봤다. 다른 코드에서는 없던 방식(?) 이었기 때문에. 스프링부트는 이런 부분이 잘 되어 있는거 같다. C# 에선 로깅을 위해 이런 코드들이 많았다. ...public static void WriteLog(string msg){ .... Console.Write(msg); ...}...public void TestA(){ ... WriteLog("aa"); ....}...public void TestB(){ ... WriteLo..

Backend/SpringBoot 2025.09.01

자바스크립트에서 타임리프 사용하기 (+onclick 인자 전달)

자바스크립트에서 타임리프 변수를 사용하기 위해선 다음과 같이 하면 된다.   만일 fragment 형식으로 페이지 구성을 할 경우, fragment 에서 스크립트를 추가 해도, 메인페이지에 추가 안될 수가 있다. 메인페이지에서 div 태그에 th:replace 를 이용하여 fragment를 호출 할 경우, 단순히 div 태그 역할을 하기 때문이다. 이럴경우 메인페이지 쪽에 javascript를 작성하든지, header fragment를 만든 후 javascript를 작성하고, header를 치환 하든지 해야 한다.  onclick에 타임리프 인자 전달하기태그에 커스텀 어트리뷰트 생성th:어트리뷰트명="${타임리프 변수명}"onclick 인자로 전달onclick = "함수명(this.getAttribute..

Backend/SpringBoot 2024.12.18

전반적인 프로젝트 구조

기본 구조아래의 4개의 구성은 모두 java 로 생성 Entity 생성DB 테이블과 1:1 매칭되는 클래스 Repository 생성Entity를 활용하여 DB에 저장, 혹은 값 검색Service 생성Repository의 DB 저장, 혹은 검색 함수를 직접적으로 호출하는, 한번 더 묶는 개념의 클래스Service 생성자에서 Repository를 인젝션 받을 수 있도록 작성Controller 생성API 를 매핑하고 , 매핑된 함수마다 Service 를 통해 비즈니스 로직에 맞는 항목을 클라이언트로 리턴Controller 생성자 에서 Service를 인젝션 받을 수 있도록 작성  DTO 활용성능에 영향을 미친다고 생각할 경우 DTO를 사용 할 수 있음. 그외에 Entity 항목을 직접 노출하기 싫을 경우도 사..

Backend/SpringBoot 2024.11.26

@Mapper, @Mapping

DTO와 Entity 간 상호 변환을 위해 사용되는 어노테이션이다. MapStruct 라이브러리를 사용한다. @Mapper 는 인터페이스에 붙이는 어노테이션이고, @Mapping 은 실제 상호 변환을 하는 함수명에 붙이는 어노테이션 이다. 그래들에 다음을 추가한다.dependencies { ... implementation 'org.mapstruct:mapstruct:1.6.3' annotationProcessor 'org.mapstruct:mapstruct-processor:1.6.3'} @Mapping (source = "변수명", target = "변수명")소스 변수명을 타겟 변수명으로 치환하는 설정을 한다. 변수명이 여러개 일 경우 @Mapping 어노테이션을 해당 개수에 맞춰..

Backend/SpringBoot 2024.11.20