1. 시작하며 의존성을 주입하기 위해 필드에 @Autowired 를 사용하면 편리하지만 intellij나 sonarLint 에서 Constructor Injection 을 사용하라는 warning을 발생시킨다. 왜 경고가 발생하는지 스프링에서 의존성을 주입하는 방법을 알아보자. 2. Inversion of Control, DI(Dependency Injection) 이란 Inversion of Control (제어의 역전 - IoC) 일명 할리우드 원칙이라고도 불린다. don’t call me, I’ll call you. 나를 부르지 마라, 내가 너를 부를 것이다. 메소드나 객체의 호출 작업을 개발자가 결정하는 것이 아니라 외부에서 결정되는 것을 의미한다. 이 방식은 대부분의 프레임워크에서 사용하는 방식..
1. 시작하며 JPA Auditing 을 통해 등록/수정 날짜/시간 설정을 자동화 해보자. 2. 왜 JPA Auditing 쓰나? 매번 엔티티의 날짜/시간 데이터가 변경돨 때마다 이를 코드로 수정한다면 여기저기 입력/수정 코드를 구현해야한다. 그러나 JPA Auditing를 사용하면 공통으로 처리할 수 있다. 3. JPA Auditing 구현 1) BaseEntity 추상 클래스를 생성한다 도메인에 BaseEntity 클래스를 생성한다. BaseEntity는 모든 Entity의 상위 클래스이다. 따라서 이를 상속받는 Entity들의 createdDate, modifiedDate를 자동으로 관리하는 역할을 한다. @Getter @MappedSuperclass @EntityListeners(AuditingE..
1. 시작하며 롬복 어노테이션 사용시에 자꾸 헷갈려서 개인적인 기억 정리 용도로 기록해 두고자 한다. 2. 왜 Lombock을 쓰나? Getter, Setter, Constructor 등을 자동으로 생성해줘서 귀찮은 일을 줄여 준다. 단, 무한루프에 빠지거나 무분별하게 setter를 남발할 수 있으니 조심해서 쓰자 3. Lombok 설치 maven org.projectlombok lombok true gradle compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' gradle 5버전 이상은 annotationProcessor 'org.projectlombok:lombok' 을 추가해주어야 한다. 그렇지않..
@PostConstruct와 @PreDestroy Annotation 사용하기 1. 언제 쓰는가 최근에 개발하다가 딱 한번만 받아오면 되는 값을 사용 시 마다 요청을 새로 호출하는 실수를 했다. 아니 누가 이따위로 개발했는가 하고 git history를 뒤져보았더니 범인은 다름아닌 과거의 나였다. 따라서 잊지 않기 위해 @PostConstruct 에 대해 기록해두고자 한다. @PostConstruct 를 사용하면 WAS 가 뜰 때 한번만 기본값을 세팅해두고 두고두고 쓸 수 있다. @PostConstruct 는 WAS 가 뜰 때 bean이 생성된 다음 딱 한번만 실행된다. @PreDestroy 는 컨테이너에서 객체를 제거하기 전에 실행된다. 2. @PostConstruct Spring은 bean을 초기화 ..
11장 WebFlux로 Reactive API 개발하기 🎯 이 장에서 배우는 내용 스프링 WebFlux 사용하기 리액티브 컨트롤러와 클라이언트 작성하고 테스트하기 REST API 소비하기 리액티브 웹 애플리케이션의 보안 11.1 스프링 WebFlux 사용하기 매 연결마다 하나의 스레드를 사용하는 스프링 MVC 같은 전형적인 서블릿 기반의 웹 프레임워크는 thread blocking과 다중 스레드로 수행된다. 즉 요청이 처리될 때 스레드 풀에서 작업 스레드를 가져와서 해당 요청을 처리하며, 작업 스레드가 종료될 때까지 요청 스레드는 블로킹된다. 이에 반해 비동기 웹 프레임워크는 더 적은 수의 스레드로 더 높은 확장성을 성취한다. 이벤트 루핑 Event looping 이라는 기법을 적용한 이런 프레임워크는 ..
Spring Integration 스프링 통합 💻 실습 : https://github.com/cusbert/spring-in-action-5th 🎯 이 장에서 배우는 내용 실시간으로 데이터 처리하기 통합 플로우 정의하기 스프링 통합의 자바 DSL 정의 사용하기 이메일과 파일 시스템 및 다른 외부 시스템과 통합하기 (이 장의 자세한 정리는 생략합니다.) 9.1 간단한 통합 플로우 선언하기 애플리케이션은 통합 플로우를 통해 외부 리소스나 애플리케이션 자체에 데이터를 수신, 전송 할 수 있다. 애플리케이션이 통합할 수 있는 리소스 중 하나가 파일 시스템이다. 9.1.1 XML 을 사용해서 통합 플로우 정의하기 9.1.2 Java 로 통합 플로우 구성하기 9.1.3 스프링 통합으로 DSL 구성 사용하기 9.2 ..
Kafka 로 메시지 전송하기 💻 실습 : https://github.com/cusbert/spring-in-action-5th 🎯 이 장에서 배우는 내용 비동기 메시지 전송 JMS, RabbitMQ, 카프카 Kafka를 사용해서 메시지 전송하기 브로커에서 메시지 가져오기 메시지 리스닝하기 8.3 카프카 사용하기 카프카는 확장성을 제공하는 cluster 로 실행되도록 설계되었다. 클러스터의 모든 카프카 인스턴스에 걸쳐 토픽(topic) 을 파티션(Partition) 으로 분할하여 메시지를 관리한다. RabbitMQ 가 exchange 와 큐를 사용해서 메시지를 처리하는 반면 카프카는 토픽만 사용한다. 카프카의 토픽은 클러스터의 모든 브로커에 걸쳐 복제된다. (replicated) 클러스터의 각 노드는 하..
RabbitMQ 메시지 전송하기 💻 실습 : https://github.com/cusbert/spring-in-action-5th 🎯 이 장에서 배우는 내용 비동기 메시지 전송 JMS, RabbitMQ, 카프카 Kafka를 사용해서 메시지 전송하기 브로커에서 메시지 가져오기 메시지 리스닝하기 8.2 RabbitMQ 와 AMQP 사용하기 AMQP(Advanced Message Queueing Protocol)의 가장 중요한 구현이라 할 수 있는 RabbitMQ 는 JMS 보다 더 진보된 메시지 라우팅 전략을 제공한다. JMS 메시지가 수신자가 가져갈 메시지 도착지 이름을 주소로 사용하는 반면, AMQP 메시지는 수신자가 리스닝하는 큐와 비리된 거래소(exchange) 이름과 라우팅 키를 주소로 사용한다. ..
8장 비동기 메시지 전송하기 : JMS 💻 실습 : https://github.com/cusbert/spring-in-action-5th 🎯 이 장에서 배우는 내용 비동기 메시지 전송 JMS, RabbitMQ, 카프카 Kafka를 사용해서 메시지 전송하기 브로커에서 메시지 가져오기 메시지 리스닝하기 비동기(Asynchronous) 메시징은 애플리케이션 간에 응답을 기다리지 않고 간접적으로 메시지를 전송하는 반복이다. 따라서 통신하는 애플리케이션 간의 결합도를 낮추고 확장성을 높여준다. 스프링은 JMS(Java Message Service), RabbitMQ, AMQP(Advanced Message Queueing Protocol), 아파치 카프카(Apahche Kafka) 가 등의 비동기 메시징을 지원한..
7장 REST 서비스 사용하기 💻 실습 : https://github.com/cusbert/spring-in-action-5th 🎯 이 장에서 배우는 내용 RestTemplate 을 사용해서 REST API 사용하기 스프링에서 사용하는 REST API RestTemplate: 스프링 프레임워크에서 제공하는 동기화된 REST client Traverson: 스프링 HATEOAS에서 제공하는 하이퍼링크를 인식하는 동기화 REST client WebClient: 스프링 5에서 소개된 반응형 비동기 REST client RestTemplate 는 다음 버전에서 deprecated 될 예정이다. WebClient 를 사용하자 7.1 RestTemplate으로 REST endpoint 사용하기 RestTamplat..
6장 REST 서비스 생성하기 💻 실습 : https://github.com/cusbert/spring-in-action-5th Front 코드와 Backend 코드 분리 Front-end tacocloud-ui directory 따로 생성 https://github.com/cusbert/spring-in-action-5th/tree/main/tacocloud-ui Back-end HATEOAS 실습 생략 https://github.com/cusbert/spring-in-action-5th/tree/main/ch6/taco-cloud HATEOAS 포함한 교재에서 제공한 샘플 코드는 실행되도록 수정하여 따로 directory 생성 https://github.com/cusbert/spring-in-acti..
5장 구성 속성 사용하기 💻 실습 : https://github.com/cusbert/spring-in-action-5th 🎯 이 장에서 배우는 내용 자동-구성되는 빈 조정하기 구성 속성을 애플리케이션 컴포넌트에 적용하기 스프링 프로파일 사용하기 5.1 자동-구성 세부 조정하기 스프링 부트는 구성 속성(Configuration Property)을 사용하는 방법을 제공한다. 스프링 애플리케이션 컨텍스트에서 구성 속성은 빈의 속성이다. 그리고 JVM 시스템 속성, 명령행 인자, 환경 변수 등 여러 가지 원천 속성 중에서 설정할 수 있다. 스프링에는 다음 두 가지 형태의 구성이 있다. 빈 연결 (Bean wiring) 컨텍스트에서 빈으로 생성되는 애플리케이션 컴포넌트 및 상호 간에 주입되는 방법을 선언하는 구..