
이 사진이 중요
클라이언트 요청 처리
서비스 계층을 도입하면 컨트롤러는 단순히 클라이언트 요청을 처리하고, 서비스는 비즈니스 로직을 담당합니다. 이렇게 하면 코드가 명확히 분리되고, 유지보수가 쉬워집니다.
애플리케이션에서 실제로 수행하는 핵심적인 규칙, 절차, 그리고 작업들을 정의하는 부분입니다. 쉽게 말해, 비즈니스 로직은 소프트웨어가 사용자의 요구사항이나 특정 업무 규칙에 따라 어떤 데이터를 어떻게 처리할지 결정하는 코드나 규칙을 의미
DTO는 클라이언트로부터 입력을 받을 때나 클라이언트로 데이터를 반환할 때 사용하는 객체입니다. 이는 도메인 모델과는 분리되어야 합니다. 특히, 민감한 정보나 불필요한 정보를 클라이언트에게 넘기지 않기 위해 DTO를 사용하는 것이 좋습니다.
Repository는 엔티티와 데이터베이스 간의 상호작용을 추상화하는 계층입니다. 리포지토리는 데이터베이스에 접근하여 데이터를 저장, 수정, 삭제, 조회하는 역할을 하며, 비즈니스 로직과 데이터 접근 로직을 분리하여 코드의 재사용성과 유지보수를 쉽게 합니다.
<리포지토리 역할>
데이터베이스와의 상호작용 관리: 리포지토리는 데이터베이스와 직접적으로 상호작용하여 데이터를 저장, 수정, 삭제, 조회하는 작업을 처리합니다. JPA에서는 리포지토리가 SQL을 자동으로 생성하여 이러한 작업을 수행합니다.
비즈니스 로직과 데이터 접근 로직의 분리: 리포지토리는 데이터 접근과 관련된 로직을 캡슐화하여, 서비스 계층이나 컨트롤러 계층에서 SQL 쿼리와 같은 복잡한 데이터베이스 작업을 신경 쓰지 않아도 되게 만듭니다. 비즈니스 로직은 서비스 계층에서 처리하고, 데이터 관련 작업은 리포지토리에서 처리합니다.
애플리케이션의 핵심 비즈니스 로직과 관련된 데이터를 표현하는 역할을 합니다. 도메인 객체는 주로 데이터베이스와의 매핑을 위해 사용되며, 애플리케이션에서 다루는 핵심 개념을 직접적으로 반영합니다.
도메인은 핵심 비즈니스 로직과 데이터를 나타내는 객체임
<도메인 객체의 특징>
데이터베이스 매핑: 도메인 객체는 보통 JPA 엔티티와 같이 데이터베이스 테이블과 매핑됩니다. 즉, 도메인 객체는 데이터베이스에서 데이터를 가져오거나 저장할 때 사용됩니다.
Entity: 데이터베이스 테이블과 매핑되며, 이 객체를 통해 데이터베이스 CRUD (Create, Read, Update, Delete) 연산을 할 수 있습니다.
public class User {
private Long id;
private String name;
private String email;
// 기본 생성자 및 getter, setter
}
1. ORM을 통한 데이터베이스 연동:
JPA 엔티티는 ORM 기술을 사용하여 객체와 데이터베이스 테이블을 매핑합니다. 이를 통해 데이터베이스와의 상호작용이 객체지향적으로 가능합니다.
2. 어노테이션 기반 매핑:
@Entity, @Table, @Id, @Column 등의 어노테이션을 사용하여 엔티티와 데이터베이스 테이블의 구조를 정의
3. 영속성 관리:
JPA 엔티티는 JPA의 EntityManager 또는 Spring Data JPA의 Repository 인터페이스를 통해 영속성 컨텍스트 내에서 관리됩니다. 이때 JPA는 엔티티의 상태를 추적하고, 필요시 자동으로 데이터베이스에 반영합니다.
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
@Entity // 이 클래스는 데이터베이스 테이블과 매핑됨을 나타냅니다.
public class User {
@Id // 기본 키 필드
@GeneratedValue(strategy = GenerationType.IDENTITY) // ID 값이 자동 생성됨
private Long id;
private String name;
private String email;
// 기본 생성자 및 getter, setter
}
영속성은 데이터가 지속적으로 저장되고 유지되는 상태. 즉, 애플리케이션이 종료되더라도 데이터가 사라지지 않고 데이터베이스 같은 영구 저장소에 저장되는 상태.
영속성 컨텍스트는 엔티티를 영속성 상태로 관리하는 환경.
쉽게 말해, 애플리케이션이 데이터베이스와 상호작용하는 중간 단계에서 엔티티를 관리하는 가상의 공간입니다.
영속성 컨텍스트는 엔티티의 생명 주기를 관리합니다. 엔티티의 생명 주기는 비영속 -> 영속 -> 준영속 -> 삭제와 같은 단계를 거치며, 영속성 컨텍스트는 이 주기를 제어합니다.
ORM은 객체 지향 프로그래밍의 객체와 관계형 데이터베이스의 테이블 간의 매핑을 자동화하는 기술을 말합니다. 객체 지향 언어로 작성된 클래스를 데이터베이스 테이블과 매핑하여, 개발자가 SQL을 직접 작성하지 않고도 데이터베이스와 상호작용할 수 있게 해줍니다.
대표적인 ORM 프레임워크로는 JPA(Java Persistence API)가 있으며, 이를 통해 다음과 같은 작업이 자동으로 이루어집니다:
객체를 데이터베이스 테이블의 레코드로 저장
데이터베이스에서 데이터를 조회해 객체로 변환
객체의 변경을 데이터베이스에 반영
<도메인과 다른 계층 간의 관계>
컨트롤러: 컨트롤러는 클라이언트로부터 HTTP 요청을 받아 서비스 계층을 통해 도메인 객체에 접근합니다.
서비스: 서비스는 비즈니스 로직을 처리하며, 필요한 경우 도메인 객체와 상호작용합니다. 서비스 계층은 도메인 객체의 데이터를 사용하거나 변경합니다.
리포지토리: 리포지토리는 도메인 객체와 데이터베이스 간의 상호작용을 처리하는 계층입니다. 도메인 객체를 데이터베이스에 저장하거나, 데이터베이스에서 조회하는 역할을 합니다.
구성 설정은 시스템의 동작 방식과 관련된 설정을 정의하는 부분입니다. 이는 소프트웨어가 특정 환경에서 제대로 동작하도록 하는 데 필요한 설정을 포함합니다. 예를 들어, 데이터베이스 연결 정보, 서버 포트, 환경 변수, 애플리케이션 설정 등이 포함됩니다.
<주요 목적>
1. 환경 설정: 개발, 테스트, 프로덕션 등 다양한 환경에서 애플리케이션이 적절히 동작하도록 설정합니다.
2. 유연성: 설정 파일이나 구성 클래스를 통해 애플리케이션의 동작을 쉽게 조정할 수 있습니다. 예를 들어, 데이터베이스 URL을 변경하거나 로그 레벨을 조정할 수 있습니다.
소프트웨어나 서비스 간에 서로 통신하고 데이터를 교환할 수 있도록 해주는 인터페이스입니다. 즉, API는 서로 다른 프로그램들이 상호작용할 수 있도록 하는 일종의 중간 다리 역할을 합니다.
API는 다양한 시스템 간의 연결을 쉽게 하고, 개발자들이 복잡한 내부 구현을 신경 쓰지 않고 기능을 사용할 수 있게 만들어줍니다.
<API의 주요 역할>
보통 HTTP 요청 메서드를 통해 작동하며, 다음과 같은 메서드를 자주 사용합니다:
API는 개념이고, REST API는 그 구현 방식 중 하나
API를 설계하고 사용하는 특정한 아키텍처 스타일입니다. 주로 웹 기반의 애플리케이션에서 사용됩니다.
HTTP 프로토콜을 사용하여 클라이언트와 서버 간에 데이터를 주고받습니다.
<REST의 특징>
아키텍처는 시스템이나 소프트웨어의 구조와 구성 요소를 정의하는 설계입니다. 시스템의 전반적인 구조와 설계를 결정하며, 각 구성 요소가 어떻게 상호작용하고 조직되는지를 설명합니다. 소프트웨어 아키텍처는 시스템의 성능, 확장성, 유지보수성, 보안성 등에 큰 영향을 미칩니다.
<아키텍처의 주요 목적>