계층 구조

cook_pasta·2024년 9월 9일

SpringBoot

목록 보기
2/5


이 사진이 중요

1. 컨트롤러 계층을 도입하는 이유

클라이언트 요청 처리

2. 서비스 계층을 도입하는 이유

서비스 계층을 도입하면 컨트롤러는 단순히 클라이언트 요청을 처리하고, 서비스는 비즈니스 로직을 담당합니다. 이렇게 하면 코드가 명확히 분리되고, 유지보수가 쉬워집니다.


비즈니스 로직(Business Logic)이란?

애플리케이션에서 실제로 수행하는 핵심적인 규칙, 절차, 그리고 작업들을 정의하는 부분입니다. 쉽게 말해, 비즈니스 로직은 소프트웨어가 사용자의 요구사항이나 특정 업무 규칙에 따라 어떤 데이터를 어떻게 처리할지 결정하는 코드나 규칙을 의미


3. DTO를 도입하는 이유

DTO는 클라이언트로부터 입력을 받을 때나 클라이언트로 데이터를 반환할 때 사용하는 객체입니다. 이는 도메인 모델과는 분리되어야 합니다. 특히, 민감한 정보나 불필요한 정보를 클라이언트에게 넘기지 않기 위해 DTO를 사용하는 것이 좋습니다.

4. 리포지토리를 도입하는 이유

Repository는 엔티티와 데이터베이스 간의 상호작용을 추상화하는 계층입니다. 리포지토리는 데이터베이스에 접근하여 데이터를 저장, 수정, 삭제, 조회하는 역할을 하며, 비즈니스 로직과 데이터 접근 로직을 분리하여 코드의 재사용성과 유지보수를 쉽게 합니다.

<리포지토리 역할>

  • 데이터베이스와의 상호작용 관리: 리포지토리는 데이터베이스와 직접적으로 상호작용하여 데이터를 저장, 수정, 삭제, 조회하는 작업을 처리합니다. JPA에서는 리포지토리가 SQL을 자동으로 생성하여 이러한 작업을 수행합니다.

  • 비즈니스 로직과 데이터 접근 로직의 분리: 리포지토리는 데이터 접근과 관련된 로직을 캡슐화하여, 서비스 계층이나 컨트롤러 계층에서 SQL 쿼리와 같은 복잡한 데이터베이스 작업을 신경 쓰지 않아도 되게 만듭니다. 비즈니스 로직은 서비스 계층에서 처리하고, 데이터 관련 작업은 리포지토리에서 처리합니다.

5. 도메인을 도입하는 이유

애플리케이션의 핵심 비즈니스 로직과 관련된 데이터를 표현하는 역할을 합니다. 도메인 객체는 주로 데이터베이스와의 매핑을 위해 사용되며, 애플리케이션에서 다루는 핵심 개념을 직접적으로 반영합니다.

도메인은 핵심 비즈니스 로직과 데이터를 나타내는 객체임

<도메인 객체의 특징>

  • 데이터베이스 매핑: 도메인 객체는 보통 JPA 엔티티와 같이 데이터베이스 테이블과 매핑됩니다. 즉, 도메인 객체는 데이터베이스에서 데이터를 가져오거나 저장할 때 사용됩니다.

  • Entity: 데이터베이스 테이블과 매핑되며, 이 객체를 통해 데이터베이스 CRUD (Create, Read, Update, Delete) 연산을 할 수 있습니다.


  1. 일반적인 엔티티 (Plain Entity) 란?
    엔티티는 데이터베이스 테이블과 매핑되는 객체를 말합니다. 엔티티는 애플리케이션의 도메인 모델을 표현하며, 일반적으로 비즈니스 로직을 표현하기 위해 사용되며, 데이터베이스와 연동되지 않음.

일반적인 엔티티 예시:

  public class User {

    private Long id;
    private String name;
    private String email;

    // 기본 생성자 및 getter, setter
}
  1. JPA 엔티티 (Java Persistence API) 란?
    엔티티는 데이터베이스의 테이블과 일대일로 매핑됨.
    JPA 엔티티와 일반적인 엔티티의 차이는 주로 데이터베이스와의 상호작용 방식에 있습니다.

JPA 엔티티의 특징:

1. ORM을 통한 데이터베이스 연동:
JPA 엔티티는 ORM 기술을 사용하여 객체와 데이터베이스 테이블을 매핑합니다. 이를 통해 데이터베이스와의 상호작용이 객체지향적으로 가능합니다.
2. 어노테이션 기반 매핑:
@Entity, @Table, @Id, @Column 등의 어노테이션을 사용하여 엔티티와 데이터베이스 테이블의 구조를 정의
3. 영속성 관리:
JPA 엔티티는 JPA의 EntityManager 또는 Spring Data JPA의 Repository 인터페이스를 통해 영속성 컨텍스트 내에서 관리됩니다. 이때 JPA는 엔티티의 상태를 추적하고, 필요시 자동으로 데이터베이스에 반영합니다.

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
}

영속성(Persistence)

영속성은 데이터가 지속적으로 저장되고 유지되는 상태. 즉, 애플리케이션이 종료되더라도 데이터가 사라지지 않고 데이터베이스 같은 영구 저장소에 저장되는 상태.

영속성 컨텍스트(Persistence Context)

영속성 컨텍스트는 엔티티를 영속성 상태로 관리하는 환경.
쉽게 말해, 애플리케이션이 데이터베이스와 상호작용하는 중간 단계에서 엔티티를 관리하는 가상의 공간입니다.
영속성 컨텍스트는 엔티티의 생명 주기를 관리합니다. 엔티티의 생명 주기는 비영속 -> 영속 -> 준영속 -> 삭제와 같은 단계를 거치며, 영속성 컨텍스트는 이 주기를 제어합니다.

ORM(Object-Relational Mapping)

ORM은 객체 지향 프로그래밍의 객체와 관계형 데이터베이스의 테이블 간의 매핑을 자동화하는 기술을 말합니다. 객체 지향 언어로 작성된 클래스를 데이터베이스 테이블과 매핑하여, 개발자가 SQL을 직접 작성하지 않고도 데이터베이스와 상호작용할 수 있게 해줍니다.

대표적인 ORM 프레임워크로는 JPA(Java Persistence API)가 있으며, 이를 통해 다음과 같은 작업이 자동으로 이루어집니다:

  • 객체를 데이터베이스 테이블의 레코드로 저장

  • 데이터베이스에서 데이터를 조회해 객체로 변환

  • 객체의 변경을 데이터베이스에 반영


<도메인과 다른 계층 간의 관계>

  • 컨트롤러: 컨트롤러는 클라이언트로부터 HTTP 요청을 받아 서비스 계층을 통해 도메인 객체에 접근합니다.

  • 서비스: 서비스는 비즈니스 로직을 처리하며, 필요한 경우 도메인 객체와 상호작용합니다. 서비스 계층은 도메인 객체의 데이터를 사용하거나 변경합니다.

  • 리포지토리: 리포지토리는 도메인 객체와 데이터베이스 간의 상호작용을 처리하는 계층입니다. 도메인 객체를 데이터베이스에 저장하거나, 데이터베이스에서 조회하는 역할을 합니다.


6. config

구성 설정은 시스템의 동작 방식과 관련된 설정을 정의하는 부분입니다. 이는 소프트웨어가 특정 환경에서 제대로 동작하도록 하는 데 필요한 설정을 포함합니다. 예를 들어, 데이터베이스 연결 정보, 서버 포트, 환경 변수, 애플리케이션 설정 등이 포함됩니다.

<주요 목적>
1. 환경 설정: 개발, 테스트, 프로덕션 등 다양한 환경에서 애플리케이션이 적절히 동작하도록 설정합니다.
2. 유연성: 설정 파일이나 구성 클래스를 통해 애플리케이션의 동작을 쉽게 조정할 수 있습니다. 예를 들어, 데이터베이스 URL을 변경하거나 로그 레벨을 조정할 수 있습니다.

  1. 중앙 집중 관리: 애플리케이션의 설정을 한 곳에서 관리함으로써, 변경 사항을 쉽게 추적하고 적용할 수 있습니다.

API(Application Programming Interface)란?

소프트웨어나 서비스 간에 서로 통신하고 데이터를 교환할 수 있도록 해주는 인터페이스입니다. 즉, API는 서로 다른 프로그램들이 상호작용할 수 있도록 하는 일종의 중간 다리 역할을 합니다.
API는 다양한 시스템 간의 연결을 쉽게 하고, 개발자들이 복잡한 내부 구현을 신경 쓰지 않고 기능을 사용할 수 있게 만들어줍니다.

<API의 주요 역할>

  1. 데이터 교환: 두 시스템 간에 데이터를 주고받을 수 있도록 합니다. 예를 들어, 프론트엔드와 백엔드가 데이터를 주고받을 때 API를 사용합니다.
  2. 기능 제공: 하나의 애플리케이션이 다른 애플리케이션의 기능을 사용할 수 있게 해줍니다. 예를 들어, Google Maps API를 사용해 웹사이트에 지도를 삽입할 수 있습니다.
  3. 보안성: API는 주로 인증 및 권한 부여를 통해 보안성 있는 방식으로 데이터에 접근하게 합니다.

API의 예시 (REST API)

보통 HTTP 요청 메서드를 통해 작동하며, 다음과 같은 메서드를 자주 사용합니다:

  • GET: 데이터를 요청할 때 사용 (예: /users로 사용자 리스트 요청).
  • POST: 새로운 데이터를 서버에 전송할 때 사용 (예: /users로 새 사용자 추가).
  • PUT: 기존 데이터를 수정할 때 사용 (예: /users/1로 사용자 정보 수정).
  • DELETE: 데이터를 삭제할 때 사용 (예: /users/1로 사용자 삭제).

API는 개념이고, REST API는 그 구현 방식 중 하나

REST API (Representational State Transfer)란?

API를 설계하고 사용하는 특정한 아키텍처 스타일입니다. 주로 웹 기반의 애플리케이션에서 사용됩니다.
HTTP 프로토콜을 사용하여 클라이언트와 서버 간에 데이터를 주고받습니다.

<REST의 특징>

  • 무상태성(Stateless): 각 요청은 독립적이며, 서버는 이전 요청에 대한 정보를 유지하지 않습니다.
  • 리소스 기반: 데이터나 기능을 리소스(예: 사용자, 제품 등)로 간주하고, 각 리소스는 URI를 통해 접근됩니다.
  • 표현의 일관성: 리소스는 다양한 형태(JSON, XML 등)로 표현될 수 있습니다.
  • HTTP 메서드 사용: CRUD(생성, 읽기, 수정, 삭제) 작업을 HTTP 메서드(GET, POST, PUT, DELETE 등)를 통해 수행합니다.

아키텍처 (Architecture)란?

아키텍처는 시스템이나 소프트웨어의 구조와 구성 요소를 정의하는 설계입니다. 시스템의 전반적인 구조와 설계를 결정하며, 각 구성 요소가 어떻게 상호작용하고 조직되는지를 설명합니다. 소프트웨어 아키텍처는 시스템의 성능, 확장성, 유지보수성, 보안성 등에 큰 영향을 미칩니다.

<아키텍처의 주요 목적>

  1. 구성 요소의 정의: 시스템을 구성하는 주요 요소와 그들의 관계를 정의합니다.
  2. 설계 원칙: 시스템을 설계하는 데 사용되는 원칙과 패턴을 명시합니다.
  3. 문제 해결: 특정 문제를 해결하기 위한 구조를 제공합니다.
  4. 상호작용 정의: 시스템 내의 구성 요소가 어떻게 상호작용하는지를 정의합니다.

나중에 참고 해야징
JPA의 개념
계층구조

0개의 댓글