DTO&DAO 스프링 계층 구조 속 역할 이해하기(feat. Lombok)

ww_ung·2025년 4월 6일

CS정리 & 기술면접

목록 보기
8/10


스프링 기반 애플리케이션은 주로 3 계층 구조로 나뉜다.
Controller : 클라이언트 요청을 받고 응답을 처리
Service : 핵심 로직 처리, 트랜잭션 관리
Respository : DB와 직접 통식

앞서서 배운 MVC패턴을 확장한 구조라고 생각하면 편하다.
Model의 부분을 좀 더 세분화 해서 Service + Repository 계층으로 나뉘었다고 보면 된다.
Model의 비즈니스 로직을 Service가 데이터 처리를 Repository가 한다.

왜 나눌까?
역할을 분리하면 유지보수와 테스트가 쉬워지고, 협업에도 유리한게 당연하다
Service, Repository로 분리되면
각 구조에서 비즈니스로직, DB처리만 집중하게 된다

DAO (Data Access Object)

DB와 통신하는 객체로 DB에 접근해서 데이터를 조회하거나 저장하는 로직을 담는 클래스이다.
Service나 Controller에 직접 DB를 접근하는것보다 안정적인 로직을 구현할 수 있다.

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    Optional<User> findByUsername(String username);
}

위의 코드 처럼 SQL 쿼리를 실행(JPA, MyBatis등)하거나
DB에서 데이터를 가져오거나 삽입, 수정, 삭제를 진행한다
보통 @Repository로 마킹되어 DB접근을 담당하게 된다.

DTO (Data Transfer Object)

데이터를 전달하는데 사용되는 객체이다.
주로 Controller <-> Service // Service <-> Client 사이에서의 데이터 전달이 필요할 때 사용한다.
Entity에는 DB 관련 설정이 많다. 따라서 직접 노출되면 보안상 위험하므로 이 또한 안정적인 서비스를 구현하기 위한 단계이다.

@Getter
@Setter
// 클라이언트 요청 시 받는 DTO
public class UserRequestDto {
    private String username;
    private String password;
}

// 클라이언트에게 응답 시 전달하는 DTO
public class UserResponseDto {
    private Long id;
    private String username;
}

위처럼 데이터 전달 전용 객체로 사용하며, Entity와는 별도의 클래스이다.
Entity는 DB 테이블과 직접 매핑되는 클래스이고
DTO는 데이터를 전달하기 위한 객체이다.
클라이언트의 요청 -> UserRequestDto -> Service계층(Entity로 변환) -> 처리결과를 DTO로 변환 -> 클라이언트 응답
이러한 구조로 흘러간다고 생각하면 된다.

Lombok 라이브러리

스프링 자체 기능은 아니지만, 스프링 프로젝트에서 거의 필수처럼 쓰이는 Lombok 라이브러리에 대해서도
같이 설명해보도록 하겠다.
반복적인 작성해야 하는 메서드들을 자동으로 생성해주는 도구라고 생각하면 된다.

자바에서는 필드의 값을 직접 접근하지 않고, 보통 밑에와 같이 다룬다.

public class User {
    private String username;
    private String password;

    public String getUsername() { return username; }
    public void setUsername(String username) { this.username = username; }
    
    public String getPassword() { return password; }
    public void setPassword(String password) { this.password = password; }

    @Override
    public String toString() {
        return "User{username='" + username + "', password='" + password + "'}";
    }
}

딱봐도 복잡한 위의 코드를 Lombok를 쓰면 몇줄로 대체가 가능하다.

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@ToString
public class User {
    private String username;
    private String password;
}

주요 어노테이션

@Getter

  • 모든 필드의 getter 생성
  • DTO, Entity에서 사용

@Setter

  • 모든 필드의 setter 생성
  • 주로 DTO (Entity는 신중하게 사용)

@ToString

  • toString() 메서드 생성
  • 디버깅용

@NoArgsConstructor

  • 기본 생성자 생성
  • JPA Entity 필요 조건

@AllArgsConstructor

  • 모든 필드 포함 생성자 생성
  • DTO, 테스트에서 사용

@RequiredArgsConstructor

  • final 또는 @NonNull 필드만 포함한 생성자
  • 의존성 주입 시 사용

@Builder

  • 빌더 패턴 생성
  • 객체 생성 시 유연성 향상됨

@Data

  • @Getter, @Setter, @ToString,
    @EqualsAndHashCode, @RequiredArgsConstructor
    포함 통합 어노테이션
  • DTO에 자주 사용

Project Lombok Site

0개의 댓글