전체 글
[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...
DIP (의존 역전 원칙) 이해하기
의존 역전 원칙 - DIP (Dependency Inversion Principle) DIP 원칙이란 객체에서 어떤 Class를 참조해서 사용해야하는 상황이 생긴다면, 그 Class를 직접 참조하는 것이 아니라 그 대상의 상위 요소(추상 클래스 or 인터페이스)로 참조하라는 원칙이다. 객체들이 서로 정보를 주고 받을 때는 의존 관계가 형성되는데, 이 때 객체들은 나름대로의 원칙을 갖고 정보를 주고 받아야 하는 약속이 있다. 여기서 나름대로의 원칙이란 추상성이 낮은 클래스보다 추상성이 높은 클래스와 통신을 한다는 것을 의미하는데 이것이 DIP 원칙이다. ※ 참고 클래스 간 의존 관계란, 한 클래스가 어떤 기능을 수행하려고 할 때, 다른 클래스의 서비스가 필요한 경우를 말한다. 대표적으로 A 클래스의 메소드..
ISP (인터페이스 분리 원칙) 이해하기
인터페이스 분리 원칙 - ISP (Interface Segregation Principle) ISP 원칙이란 범용적인 인터페이스 보다는 클라이언트(사용자)가 실제로 사용하는 Interface를 만들어야 한다는 의미로, 인터페이스를 사용에 맞게 끔 각기 분리해야한다는 설계 원칙이라고 보면 된다. 만약 인터페이스의 추상 메서드들을 범용적으로 이것저것 구현한다면, 그 인터페이스를 상속받은 클래스는 자신이 사용하지 않는 인터페이스마저 억지로 구현 해야 하는 상황이 올 수도 있다. 또한 사용하지도 않는 인터페이스의 추상 메소드가 변경된다면 클래스에서도 수정이 필요하게 된다. 즉, 인터페이스 분리 원칙이란 인터페이스를 잘게 분리함으로써, 클라이언트의 목적과 용도에 적합한 인터페이스 만을 제공하는 것이다. 따라서 아..