3 Layer Architecture는 소프트웨어 시스템을 세 개의 논리적 계층으로 분리하는 아키텍처

3개의 레이어로 분리
3 Layer Architecture의 목적
일반 사용자가 애플리케이션과 상호작용하는 사용자 인터페이스 및 커뮤니케이션 계층
@RestController
public class HelloController {
// ...
}
해야 할 일
하지 말아야 할 일
데이터베이스와의 상호작용을 담당
실제 데이터베이스에서 데이터를 저장하거나 가져오는 계층
public interface UserRepository extends JpaRepository<User, Long> {
// ...
}
해야 할 일
하지 말아야 할 일
레이어간 통신 규칙
허용되는 통신
- 상위 -> 하위: 상위 계층이 하위 계층을 호출
- 같은 계층: 동일 계층 내 컴포넌트 간 통신
금지되는 통신
- 하위 -> 상위: 하위 계층이 상위 계층 직접 호출
- 계층 건너뛰기
- 잘못된 예) Controller가 Repository 직접 호출
데이터를 전달하기 위한 순수 데이터 객체

스프링은 Client의 요청을 받고, 이 요청을 자바 코드로 변환하여 처리함
이때, 사용자의 Request 데이터를 자바 코드에 담아 Controller에 옮겨줄 객체가 필요한데, 이 객체가 바로 DTO
영속성 컨텍스트는 엔티티를 영구 저장하는 환경을 뜻하며 애플리케이션과 데이터베이스 사이에서 객체를 보관하는 가상의 데이터베이스 같은 역할을 함
엔티티 매니저를 통해 엔티티를 저장하거나 조회하면 엔티티 매니저는 영속성 컨텍스트 한 개를 만들어 엔티티를 보관하고 관리
JPA가 엔티티를 관리하는 임시 저장소
영속성 컨텍스트가 하는 일
엔티티 생명주기(Entity Lifecycle)란 엔티티 객체가 생성되어 소멸하기까지 거치는 여러 상태의 변화 과정을 의미

영속성 컨텍스트와는 아무런 관계가 없는 상태
쉽게 말하자면, DB에 한 번도 갔다오지 않은 상태
엔티티가 영속성 컨텍스트에 의해 관리되는 상태
쉽게 말하자면, DB를 갔다 온 상태
트랜잭션 내에서 데이터베이스를 한 번이라도 갔다 온 엔티티를 관리
트랜잭션
여러 작업을 하나의 단위로 묶어서 모두 성공하거나 모두 실패하게 하는 것
이 특성을 원자성이라고 함
readOnly : true 설정 시, 읽기 전용으로 사용하여 성능을 최적화 (CUD 작업 불가)propagation : 트랜잭션 전파 규칙을 정의합니다. (e.g., REQUIRED, REQUIRES_NEW)isolation : 트랜잭션의 격리 수준을 설정하여 동시성 문제를 제어rollbackFor : 특정 예외가 발생했을 때 강제로 롤백하도록 지정JpaRepository CRUD
JpaRepository를 사용하면 쿼리를 작성하지 않고도 쉽게 DB에 데이터를 CRUD 할 수 있음
save(entity)findById, findAll 등delete(entity), deleteById(id), deleteAll()이러한 메서드들을 ‘쿼리메서드’라고 함