Spring/개념
[Spring] 엔티티(Entity) 또는 도메인 객체(Domain Object)와 DTO를 분리해야 하는 이유
개발을 하다 보면 API의 요청이나 응답을 처리할 때 또는 다른 계정으로 넘기는 파라미터가 너무 많은 시점에 별도의 DTO를 생성해야 하나 고민을 하는 시점이 생긴다. 또한 간단한 애플리케이션이 아니고서는 엔티티와 DTO를 분리하는 것을 추천하는데, 이번에는 그 이유에 대해 알아보고자 한다. 엔티티(Entity) 또는 도메인 객체(Domain Object)와 DTO를 분리해야 하는 이유 엔티티는 비즈니스 로직을 포함하는 도메인 엔티티와 데이터베이스 관련 처리를 위한 영속성 엔티티로 나누어질 수 있다. 하지만 아래의 내용에서는 설명의 편의를 위해 2개를 합하여 설명하고자 한다. 엔티티(Entity)와 DTO를 분리해야 하는 이유 관심사의 분리 Validation 로직 및 불필요한 코드 등과의 분리 API ..
[Spring] JDBC 기본에 충실한 Transaction 동작 원리
JDBC 트랜잭션에 대한 이해 Transaction 기본 동작 원리를 살펴보고자. 궁극적으로는 @Transactional 이 어떻게 돌아가는지를 살펴보겠지만, 우선은 그것보다도 중요한 JDBC에서 트랜잭션을 사용하는 방법에 대해서 이해하고 넘어갈 것이다. 사실 Spring의 @Transactional 애노테이션, JPA(Hibernate), JOOQ 등을 쓰면 라이브러리 내에서 관리되므로 아래와 같은 문제는 일어날 일이 없다. 앞서 언급한대로 원활한 이해를 위해 아래 JDBC가 트랜잭션을 다루는 코드를 살펴보자. import java.sql.Connection; Connection connection = dataSource.getConnection(); // (1) try (connection) { co..
[Spring] Transaction(트랜잭션)이란?
DB의 트랜잭션 개념에 대해 학습하고 Spring에서 트랜잭션이 어떻게 동작하고 활용되는지 살펴보고자. [DB] 트랜잭션이란? 트랜잭션이란? 트랜젝션은 하나의 작업을 수행하는데 필요한 데이터베이스의 연산들을 모아놓은 것으로, 데이터베이스의 *무결성을 유지하며 DB의 상태를 변화시키기 위한 작업 수행의 논리적 s-y-130.tistory.com Transaction(트랜잭션)이란? Transaction의 탄생 배경 보다 복잡한 프로그램을 개발하다 보면 쿼리 한 줄로 해결할 수 없는 로직을 처리해야하는 경우가 많다. 그리고 여러 개의 쿼리가 처리되는 상황에서 문제가 생겨버린다면 시스템에 큰 결함을 남기게 된다. 예를 들어 쇼핑물 서비스를 구현한다고 하면 아래와 같은 로직은 한 줄로 처리하는 것이 불가능할 것..
[Spring] Spring의 3가지 핵심 특징(IoC/DI, PSA, AOP)와 3가지 계층 구조(Controller, Service, Repository)
Spring에 대한 이해 Spring Framework(스프링 프레임워크)은 자바 기반의 웹 애플리케이션 개발을 위한 프레임워크이다. 스프링은 객체 지향 개발을 매우 용이하게 할 수 있도록 도와주며, 애플리케이션을 빠르고 효율적으로 개발할 수 있도록 기본 틀과 공통 프로그래밍 모델, API 등을 제공한다. 스프링 개발자라면 최소한 이 3가지 프로그래밍 모델만큼은 잘 이해하고 자유롭게 응용할 수 있어야 한다. Spring Container(스프링 컨테이너) 스프링은 스프링 컨테이너 또는 애플리케이션 컨텍스트라고 불리는 런타인 엔진을 제공한다. 스프링 컨테이너는 설정 정보를 참고하여 애플리케이션을 구성하는 오브젝트(빈)을 생성하고 관리한다. 그리고 의존성을 갖는 객체에 대해 의존성 주입(Dependency ..
[Spring] 빈(Bean)의 생성과 소멸에 대한 관리(@PostConstruct초기화와 @PreDestroy소멸자)
빈(Bean)의 라이프사이클(Life-Cycle) 제어 개발을 진행하면서 애플리케이션을 구동할 때 Service 계층에서 Arcus 캐시로 접근해야 하는 상황이 발생하였다고 가정해보자. Arcus 문서에는 서버 종료 시에 shutdown() 함수를 반드시 호출하라고 명시되어 있었다. 이러한 상황에서 어떻게 Bean의 소멸을 처리할 것인지 문제가 발생하였는데, 이를 위해 다음과 같은 가상의 CacheClient를 통해 Bean의 라이프사이클을 제어하는 방법에 대해 알아보고자 한다. @RequiredArgsConstructor public class CacheClient { private final String url; // 생성자 이후 호출되어야 함 public void connect() { System...
[Spring] Spring Boot는 어떻게 다중 유저 요청을 처리할까? Controller 1개가 어떻게 수 많은 Request를 처리하는가?
스프링 부트는 웹서버 어플리케이션 구조에 대해 잘 몰라도, 뚝딱 웹서버 어플리케이션을 만들도록 도와준다. 하지만 한번씩 궁금증이 들 때가 있다. Controller는 한 개인가? 스프링은 기본적으로 singleton bean을 생성하는데 contoller도 분명 singleton일거 같은데... 그럼 singleton으로 생성된 contoller를 여러 쓰레드가 공유한다면 동기화 문제는?? Contoller가 한 개라면 10만 개의 Request가 있다면 Controller 1개가 전부다 처리하는건가? 그래서 위 질문을 해결하기 위해 내장 톰캣, 스레드 풀, JVM 메모리 관점에서 파악해보고자 한다. 위 그림은 스프링부트의 flow를 찾아보면 흔히 나오는 MVC 흐름도 그림이다. "한 유저의 요청이 어떻..
[Spring] @RestControllerAdvice를 이용한 Spring 예외 처리 방법
예외 처리는 애플리케이션을 만드는데 매우 중요한 부분을 차지한다. Spring 프레임워크는 매우 다양한 에러 처리 방법을 제공하는데, 앞선 포스팅에서 @RestControllerAdvice를 사용해야 하는 이유에 대해서 자세히 알아보았다. 이번 포스팅에서는 @RestControllerAdvice를 이용해 에러를 처리하는 방법에 대해서 구현하면서 살펴보도록 하자. @ControllerAdvice와 @RestControllerAdvice ControllerAdvice와 RestControllerAdvice Spring은 전역적으로 예외를 처리할 수 있는 @ControllerAdvice와 @RestControllerAdvice 어노테이션을 각각 Spring3.2, Spring4.3부터 제공하고 있다. 두 개의..
[Spring] 스프링의 다양한 예외 처리 방법(ExceptionHandler, ControllerAdvice 등)
예외 처리는 애플리케이션을 만드는데 매우 중요한 부분을 차지한다. Spring 프레임워크는 매우 다양한 에러 처리 방법을 제공하는데, 어떠한 방법들이 있고 가장 좋은 방법(Best Practice)은 무엇인지 살펴보도록 하자. 스프링의 기본적인 예외 처리 방법 Spring이 제공하는 다양한 예외 처리 방법들을 살펴보기 전에, 먼저 우리가 개발한 Controller에서 발생한 예외를 Spring은 기본적으로 어떻게 처리하고 있는지 살펴보도록 하자. 아래의 내용들은 SpringBoot를 기반으로 설명된다. Spring의 기본적인 예외 처리 방식(SpringBoot) 예를 들어 우리가 만든 다음과 같은 컨트롤러가 있다고 하자. @RestController @RequiredArgsConstructor publi..