Spring 기초(41)
-
ThreadLocal - 예제로 알아보는 쓰레드 로컬 (1)
쓰레드 로컬을 학습하기 위해 우선 간단한 예제 프로젝트를 만들어보자. 이번 포스팅은 예제 프로젝트를 작성하며 발생하는 문제점을 알아본다. 다음 포스팅에서 쓰레드 로컬로 해결하는 방법을 소개한다. 상품을 주문하는 프로세스로 가정하고, 일반적인 웹 애플리케이션에서 Controller --> Service --> Repository로 이어지는 흐름을 단순하게 작성한다. @Repository @RequiredArgsConstructor public class OrderRepositoryV0 { public void save(String itemId) { //저장 로직 if (itemId.equals("ex")) { throw new IllegalStateException("예외 발생!"); } sleep(100..
2022.07.07 -
@Profile 어노테이션
1) 로컬에서 애플리케이션을 실행할 때 2) 테스트를 실행할 때 3) 실제 운영을 위해 배포할 때 위의 세가지 경우에서 각각 다른 설정을 사용하고 싶고, 해당 설정에 맞는 Bean을 사용하고 싶은 경우 @Profile 어노테이션을 사용하면 좋다. 스프링은 프로필(@Profile)을 통해 런타임 환경을 설정할 수 있는 기능을 제공한다. 파일을 여러 개로 분리하는 대신에 빈 구성이 달라지는 내용을 프로필로 정의해서 만들어두고, 실행 시점(런타임)에 어떤 프로필의 빈 설정을 사용할 지 지정할 수 있는 것이다. 먼저, application.properties 설정파일을 한번 살펴보자. 하나는 java 패키지의 설정파일로, 1번 경우에 해당한다. 아래는 test 패키지 하위에 있는 application.prope..
2022.07.06 -
[Spring] API - 컬렉션 조회(1 : N)
일대다 관계(One To Many)에서 조회하는 방법과 최적화하는 방법을 알아보자! toOne 관계와는 다르게 주의할 점이 많다. V1. 엔티티 직접 노출 V2. 엔티티를 조회해서 DTO로 변환하기 V3. 엔티티를 조회해서 DTO로 변환(fetch join 사용) V4. JPA에서 DTO로 바로 조회(1+N 쿼리) V5. JPA에서 DTO로 바로 조회(최적화로 1+1 쿼리) V6. JPA에서 DTO로 바로 조회(플랫 데이터 1쿼리) 이번 포스팅에서는 V3. 엔티티를 조회해서 DTO로 변환(fetch join 사용) 까지 알아보고, 다음 포스팅에서는 V6. JPA에서 DTO로 바로 조회(플랫 데이터 1쿼리)다루고있다. V1. 엔티티 직접 노출 먼저 Order와 OrderItem은 1:N의 관계이다. Ord..
2022.04.17 -
[Spring] 빈(Bean) 생명주기 콜백+ 빈 의존관계 주입 후 콜백
데이터베이스 커넥션 풀이나, 네트워크 소켓처럼 애플리케이션 시작 시점에 필요한 연결을 미리 해두고, 애플리케이션 종료 시점에 연결을 모두 종료하는 작업을 진행하려면, 객체의 초기화와 종료 작업이 필요하다. 스프링을 통해 이러한 초기화 작업과 종료 작업을 어떻게 진행하는지 예제로 알아보았다. 간단하게 외부 네트워크에 미리 연결하는 객체를 하나 생성한다고 가정해보자. 이 NetworkClient 는 애플리케이션 시작 시점에 connect() 를 호출해서 연결을 맺어두어야 하고, 애플리케이션이 종료되면 disConnect() 를 호출해서 연결을 끊어야 한다. 현재는 생성자에서 connect()를 호출하여 연결을 맺는다. public class NetworkClient { private String url; p..
2022.04.16 -
스프링 타입 컨버터(2) - Formatter
스프링 타입 컨버터(1) 포스팅에서 보았던 Converter 는 입력과 출력 타입에 제한이 없는, 범용 타입 변환 기능을 제공한다. 일반적인 웹 애플리케이션 환경을 생각해보자. 불린 타입을 숫자로 바꾸는 것 같은 범용 기능 보다는 개발자 입장에서는 문자를 다른 타입으로 변환하거나, 다른 타입을 문자로 변환하는 상황이 대부분이다. 예를들면, 화면에 숫자를 출력해야 하는데, Integer String 출력 시점에 숫자 1000 문자 "1,000" 이렇게 1000 단위에 쉼표를 넣어서 출력하거나, 또는 "1,000" 라는 문자를 1000 이라는 숫자로 변경해야 하는 경우. 날짜 객체를 문자인 "2021-01-01 10:50:11" 와 같이 출력하거나 또는 그 반대의 상황이 있겠다. 이렇게 객체를 특정한 포멧에..
2022.04.11 -
스프링 타입 컨버터(1) - converter, conversionService
애플리케이션을 개발하다 보면 타입을 변환해야 하는 경우가 매우매우 많다. 아래 코드를 보자. @RestController public class HelloController { @GetMapping("/hello-v1") public String helloV1(HttpServletRequest request) { String data = request.getParameter("data"); //문자 타입 조회 Integer intValue = Integer.valueOf(data); //숫자 타입으로 변경 System.out.println("intValue = " + intValue); return "ok"; } } String data = request.getParameter("data") HTTP 요..
2022.04.11