웹 프로그래밍/[ Spring Boot ] 12

[ SpringBoot ] 11. ModelMapper 라이브러리 이용하기

ModelMapper 엔티티와 DTO간에 변환 시 자동으로 Object를 매핑시켜주는 라이브러리 주의: 매핑해줄 클래스에는 setter가 있어야하고 매핑이 되는 클래스에는 getter가 있어야 사용 가능하다! 기본적으로 ModelMapper에서 제공하는 map() 메서드를 이용하면 변환할 수 있고 클래스 내부에 있는 변수들의 이름을 분석해서 자동 매핑시켜주는 방식이다. 이 map() 메소드가 호출되면 source(from)와 destination(to)의 타입이 분석되고 matching strategy와 configuration에 의해서 어느 프로퍼티가 매칭될지 결정된다. 때에 따라서 매핑을 명시적으로 정의해야 하는데, ModelMapper는 다양한 매핑 접근 방식을 지원하므로 메서드와 필드참조를 혼합해..

[ SpringBoot ] 10. DDD: 도메인주도설계

DDD: 도메인주도설계 객체지향의 핵심은 무엇일까? 객체지향에서의 핵심은 실세계의 객체(물건, 사람, 주문, .. 주도적으로 뭔가 생산할 수 있는 주체) 들이 서로간의 상호작용을 바탕으로 책임,협력,역할의 관점을 가지고 메세지를 교환하는 것이다. 객체지향의 핵심은 결국 객체(무언가를 만드는 주체)라고 할 수 있다. 그렇다면 어떤 객체가 필요한지 알 수 있고 어떻게 이 객체들을 추려내서 상호작용할 수 있을까? 이를 해결할 수 있는 것이 바로 도메인 주도 설계(DDD: Domain Driven Design)이다. 다시 말해서, 도메인을 중심으로 설계해 나가는 것이다. 도메인이란 실세계에서 사건이 발생하는 집합이라고 생각하면 쉽다. 쇼핑몰을 예로 들면, 쇼핑몰에서는 손님이 주문하는 도메인(Order Domai..

[ SpringBoot ] 09. AOP를 활용한 REST API의 Error Handling

AOP를 활용한 REST API의 Error Handling SpringBoot에서 기본적으로 오류처리에 대한 동작 흐름에 대해 알아보자. SpringBoot는 모든 오류를 적절한 방식으로 처리하며 /error로 매핑하는 전역 오류 페이지 등록을 제공한다. 또, http 상태와 예외에 대한 메시지를 JSON으로 응답하거나 html 형식으로 렌더링 하는 whitelabel 페이지 뷰를 제공한다. BasicErrorController SpringBoot의 기본 오류 처리 SpringBoot는 오류가 발생하면 server.error.path에 설정된 경로에서 요청을 처리하게 된다. 기본적으로 BasicErrorController가 등록이 되어 있어서 해당 요청을 처리하게 된다. @Controller @Requ..

[ SpringBoot ] 08. Method Lookup Injection In Spring

Method Injection 생명주기가 다른 두 빈에 대한 작업을 할 때 사용하는 Injection 방법 Singleton Bean이 Prototype Bean의 참조를 가지고 있어서 Prototype이어야 하는 객체가 싱글톤으로 동작하는 문제를 해결하기 위해 생겨난 것 위와 같은 경우에 Spring은 singleton 객체를 리턴할 때 최초 한번 생성된 bean의 인스턴스를 계속해서 리턴하게 되는데 위와 같이 정의된 경우에는 singleBean은 singleton 패턴으로 초기 생성 이후 소멸하지 않기 때문에 singleBean 내부에 가지고 있는 someBean 역시 최초에 만들어지고, 다시 만들어지지 않게 되는 현상이 발생한다. 나는 someBean을 prototype으로 사용하고 싶다고!! 사실..

[ SpringBoot ] 07. RestTemplate을 알아보자

RestTemplate Spring 3.0부터 지원하는 Spring의 HTTP 통신 템플릿 (server to servet) RESTful의 원칙을 지킬 수 있으며 HTTP 메소드들에 적합한 여러 메소드가 제공됨 HTTP 요청 후 JSON, XML, string과 같이 응답을 받을 수 있는 템플릿 (그게 아니라면 직접 라이브러리로 파싱해야함) Blocking I/O 기반의 동기방식을 사용(REST API 호출 후 응답을 받을 때까지 기다린다) Header와 Content-Type을 설정해서 외부 API 호출 가능 단순 메소드 호출 만으로 복잡한 작업을 쉽게 처리 가능 HttpClient : HTTP를 사용해 통신하는 범용 라이브러리로 RestTemplate은 HttpClient를 추상화 해서 제공한다. ..

[ SpringBoot ] 06. ResponseEntity에 관하여

ResponseEntity 먼저 Spring framework에 HttpEntity라는 클래스가 존재한다. 이 클래스는 HTTP 요청(request)이나 응답(response)에 해당하는 HttpHeader와 HttpBody를 포함하는 클래스이다. public class HttpEntity { private final HttpHeaders = headers; @Nullable private final T body; } public class RequestEntity extends HttpEntity public class ResponseEntity extends HttpEntity RequestEntity와 ResponseEntity는 이렇게 HttpEntity 클래스를 상속받아 구현한 클래스이다. Re..

[ SpringBoot ] 05. RestController가 뭐죠?

RestController 전통적인 Spring MVC에서의 @Controller는 주로 View를 반환하기 위한 용도로 사용되었다. MVC 컨테이너는 Client의 요청으로부터 View를 반환한다. Spring MVC의 @Controller에서 데이터를 반환하기 위해서는 컨트롤러의 각 메소드에 @ResponseBody 어노테이션을 사용하면 JSON 형태로 데이터를 반환할 수 있다. 이 때 ViewResolver를 통해 데이터를 담을 View를 찾는 과정을 거치게 된다. Spring 4.0에서 Spring 프레임워크에서 RESTful 웹 서비스를 쉽게 개발할 수 있도록 @RestController라는 것이 추가됨. RestController는 @Controller와 @ResponseBody의 조합으로 단..

[ SpringBoot ] 04. Lombok 라이브러리

Lombok Lombok은 자바의 반복 메서드 작성 코드를 줄여주는 코드 다이어트 라이브러리이다. 보통 DTO, Model, Entity의 경우 여러 속성이 존재하고 이들의 프로퍼티에 대해서 Getter, Setter, 생성자 등 매번 작성해줘야 하는 부분을 자동으로 만들어주는 라이브러리이다. 코딩과정에서는 어노테이션만 보이지만, 실제 컴파일된 .class 파일에는 연관 코드들이 생성되어 있게 된다. 귀찮은 과정을 줄여주고 반복되는 코드작성을 대신하기 때문에 많은 개발자들이 사용하고 있지만 호불호가 갈리는 라이브러리이기도 하며, 개별 작동방식을 잘 알고 사용하는 것이 좋다. @Getter, @Setter @Getter와 @Setter를 클래스 이름 위에 적용 시키면 모든 non-static 변수들에 대한..

[ SpringBoot ] 03. Spring의 Bean Scope를 알아보자

Bean Scope Bean을 정의할 때 해당 빈에 정의된 클래스의 실제 인스턴스를 생성하기 위한 방법을 생성한다. 단일 레시피로 많은 객체 인스턴스를 만들 수 있기 때문에 Bean Definition에 관한 개념은 매우 중요하다. 스프링은 기본적으로 모든 Bean을 Singleton으로 생성해 관리한다. 구체적으로는 애플리케이션 구동시 JVM 안에서 스프링이 bean마다 하나의 객체를 생성하는 것을 의미하고, 우리는 스프링을 통해서 bean을 제공받으면 주입 받은 bean은 언제나 동일한 객체임을 가정하고 개발한다. 특정 Bean Definition에서 생성된 객체에 연결될 다양한 종속성과 구성을 제어할 수 있을 뿐만 아니라, 특정 Bean Definition에서 생성된 객체의 범위도 제어할 수 있다...

[ SpringBoot ] 02. Spring의 Autowiring과 Qualifer

Autowiring IoC 컨테이너에 등록된 빈을 어떻게 꺼내서 사용할 것인가 ? 스프링에는 다양한 의존성 주입 방법이 있는데, 생성자로 직접 주입을 받아도 되지만 @Autowired를 사용하면 IoC 컨테이너에 들어있는 Bean을 주입받아서 사용할 수 있다. 스프링 컨테이너는 협력관계에 있는 빈들에 대해서 자동으로 관계를 주입한다. ApplicationContext의 내용을 조사한 뒤에 Spring이 빈에 대해서 자동으로 다른 연관관계 빈에 대해서 의존성을 주입할 수 있도록 할 수 있다. Autowire을 사용하면 다음과 같은 이점을 가진다. 특정 프로퍼티나 생성자의 argument를 지정할 필요성을 크게 줄일 수 있다. 클래스가 발전함에 따라서 구성의 업데이트를 쉽게 할 수 있다. 이 말은, 클래스에..

[ SpringBoot ] 01. Spring Bean의 LifeCycle

Spring Bean LifeCycle Spring Bean이라고 하는 것은 일반적으로 객체인데, IoC 컨테이너가 관리하는 객체를 Bean이라고 한다. ( new로 만드는 객체는 Bean이 아니다 ) 대략적으로 스프링 빈의 life cycle은 아래와 같다. # 객체 생성 > 의존 설정 > 초기화 > 소멸 단계 스프링 컨테이너를 초기화 할 때 스프링 컨테이너는 빈 객체를 생성하게 되고 이 시점에 DI를 통한 의존성이 주입된다. 모든 의존 설정이 완료되면 빈 객체를 초기화 하기 위해서 스프링은 빈 객체의 지정된 메서드를 호출하게 된다. 마지막으로 스프링 컨테이너가 close() 메서드로 종료될 시점에 컨테이너는 빈 객체의 소멸을 처리하고 이때도 지정된 메서드를 호출하게 된다. 그럼 어떻게 Spring C..

[ SpringBoot] 00. @SpringBootApplication Annotaion

@SpringBootApplication 스프링부트 템플릿을 통해 프로젝트를 생성하면 아래와 같이 자동으로 xxxApplication에 메인메소드가 생성이 된다. @SpringBootApplication public class FileDbWorkApplication { public static void main(String[] args) { SpringApplication.run(FileDbWorkApplication.class, args); } } 그 곳에 @SpringBootApplication이 존재하게 되며 그 안을 확인해보면 @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @SpringBo..