부제: RabbitMQ Spring 연동, RabbitMQ 연동 이전 글에서 이어집니다. 이번 시리즈에서는 Spring AMQP에 대해 소개하고 간단한 예제를 작성해본다. 이전 글에서 이어서 간단한 예제를 소개할 것이다. 1. 사전 준비 사항 먼저 Spring Boot와 JAVA를 구동할 적절한 IDE가 필요하다. IntelliJ 를 추천한다. 그리고 실행 중인 RabbitMQ가 필요한데, 이번 예제에서는 Docker를 활용해서 간단하게 실행해볼 예정이다. 그러므로 Docker 설치가 필요하다. Docker가 설치된 PC에서 아래 명령어를 실행하면 RabbitMQ를 실행할 수 있다. docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabb..
부제: RabbitMQ Spring 연동, RabbitMQ 연동 이번 시리즈에서는 간단한 Spring AMQP 예제를 소개한다. 예제를 시작하기 전에 이번 포스팅에서는 AMQP라는 것에 대해 소개할 것이다. 1. AMQP 정의 Advanced Message Queuing Protocol의 약자이다. 이름에서 알 수 있듯 MQ(Message Queuing)기반의 프로토콜이다. 메시지관리, 큐잉, 라우팅(peer to peer, pub-sub), 신뢰성, 보안 등에 대해 정의하고 있다. Spring AMQP는 Spring에서 AMQP기반 메시징 애플리케이션을 개발할 수 있도록 Spring의 개념을 적용한 라이브러리이다. 비동기 메시지 리스너, 큐 선언, exchange 선언 및 binding 기능 등 전반적..
작은 규모의 서비스를 개발한다면 서버와 클라이언트 간 호출이 대부분일 것이다. 하지만 더 큰 서비스가 될 수록 서버와 서버간 HTTP 호출이 필요해진다. 서버 아키택처가 MSA와 같은 형태라면 정말 많이 사용할 것이다. Spring boot에서는 다른 서버의 API endpoint를 호출할 때 RestTemplate을 많이 쓴다. 이 글에서는 RestTemplate을 활용하여 다른 서버를 호출하는 서비스 예제를 다뤄볼 것이다. 시작하기 전에, RestTemplate을 잘 모른다면 여기를 참고하자. 이 예제는 JAVA 11로 작성되었으며 프로젝트의 전체 내용은 Github에 공유되어있다. 1. 설정하기먼저 Spring boot를 사용하기 위해 build.gradle을 아래와 같이 설정한다.plugins {..
Spring으로 개발하면서 개인적으로 궁금했던 내용이다. (나는 Field Injection을 자주 쓴다.) 왜 Field Injection을 쓰면 IntelliJ에서 쓰지 말라고 경고할까? 나는 그동안 Field Injection으로 불편함 없이 개발해왔다. 게다가 Field Injection이 Constructor Injection 보다 작성할 코드가 더 적다. 그러나 IntelliJ는 항상 아래와 같은 Yellow-Block으로 나한테 엄포를 놓는다. Field Injection을 쓴다는 건 소스코드 상의 Warning과 같다는 건데.. 궁금해져서 찾아볼 겸 이 내용으로 오랜만에 블로그에도 남긴다. 1. Field Injection? Constructor Injection? 먼저 Field Inje..
부제: Hibernate Dynamic Eager and Lazy Load. JPA eager/lazy load. JPA eager load 하기 Hibernate는 JPA의 대표주자라고 할 수 있는 ORM(Object Relational Mapping)이다. MyBatis와 같은 SQL-Mapper와 달리 개발자가 쿼리를 직접 작성하지 않는다는 특징이 있다. 그래서 생산성이 좋고 SQL을 직접 작성하지 않으니 쓸데없이 DAO를 찍어낼 필요도 없고 장점이 많지만, 이 글에서 다루지 않을 것이다. 1. Eager load 와 Lazy load Eager-load와 Lazy-load에 대해 먼저 짚고 넘어가자. 뒤따라올 두개의 모델 예제를 보면 된다. @Entity public class Student { ..
REST API 웹 서버를 개발할 때 모든 Request와 Response를(Header와 Body 전부!) 하나의 JSON Object formate에 로깅하고 싶을 때가 있다. 이번 포스팅에서는 HttpServletRequestWrapper을 활용한 Request body를 처리기법으로 로깅하는 법에 대해 다루겠다. (How to log whole request and response at once?) 얼핏 생각하면 Request 및 Response를 logging 할 때 aspect를 활용해서 로깅하면 될 것 같다. 그러나 이건 좋은 방법이 아니다. 이유는 크게 두가지인데.. 1. Request와 Response를 한번에 로깅할 수 없다.2. Request의 Stream은 중복해서 읽을 수 없다. ..
애플리케이션에서 설정에 관련된 상수는 소스코드와 별도로 관리하는 것이 기본이다. 설정과 관련된 값을 소스코드 내부에서 관리하면.. 값이 바뀔 때마다 매번 컴파일을 해야해서 번거롭기 때문이다. Spring Boot는 프로젝트 설정에 쓰이는 내용 또는 각종 상수를 .yml 이나 .properties 파일에 저장할 수 있게 지원한다. 이번 포스팅에서는 .properties의 상수를 Enum에 초기화 하는 법을 간단히 알아보겠다. Spring Boot에서 .properties 파일의 값을 가져올 때는 @Value 라는 어노테이션을 쓴다. 이것을 쓰면 Bean 객체가 초기화 될때 @Value에 지정된 값을 해당 프로퍼티에 초기화 한다. setter를 활용해서 초기화를 하는 것도 가능하다. 아래의 간단한 예제를 보..
★관련 링크Spring과 DB이야기 - 1. DataSource와 JdbcTemplateSpring과 DB이야기 - 2. JdbcTemplate에서의 UPDATE, INSERT 데이터베이스 트랜잭션(Database Transaction)은 데이터베이스에서 상호작용의 단위라고 할 수 있다. 연관된 두 개 이상의 쿼리를 실행할 때, 모든 작업이 끝났을 때 COMMIT을 수행하고 중간에 오류가 발생하면 ROLLBACK하는 것이 기본이다. (트랜잭션을 잘 모른다면 여기를 클릭) 트랜잭션을 JAVA에서 구현한다면 아래와 같을 것이다. Connection conn = null; try { conn = DriverManager.getConnection(jdbcUrl, user, pw); conn.setAutoComm..
부제: @Autowired @Resource 차이, Spring @Qualifier, Spring Annotation 종류 Spring의 핵심 개념 중 하나인 DI는 Dependency Injection의 약자이다. 이 포스팅에서는 DI와 의존(Dependency)에 대한 자세한 설명은 하지 않고, 위키피디아의 설명으로 대신하겠다. 프로그래밍에서 구성요소간의 의존 관계가 소스코드 내부가 아닌 외부의 설정파일 등을 통해 정의되게 하는 디자인 패턴 중의 하나이다. 한편, 특정 객체에 의존 객체를 주입하는 방식은 두가지이다. 1. 생성자를 통한 주입. 2. Setter 메소드를 통한 주입. 이는 각각 XML로 아래와 같이 구현할 수 있으며, xml파일에 의존관계를 설정하는 것을 명시적 의존 주입이라고 한다. ..
★관련 링크Spring과 DB이야기 - 1. DataSource와 JdbcTemplateSpring과 DB이야기 - 3. Transaction 처리 지난 포스팅에서 DataSource의 개념과 Spring에서 DataSource를 활용한 JdbcTemplate으로 간단한 SELECT 쿼리를 작성해봤다. 이번 포스팅에서는 UPDATE와 INSERT에 대해 짚어보겠다. JdbcTemplate을 활용하여 INSERT, UPDATE, DELETE 쿼리를 실행할 때는, update() 메소드를 사용하면 된다. update() 메소드는 아래와 같다. - int update(String sql) - int update(String sql, Object... args) int 형태의 리턴을 하는데, 쿼리 실행 결과로 ..