waveofmymind
기록하는 습관
waveofmymind
전체 방문자
오늘
어제
  • 분류 전체보기 (124)
    • 📝 정리 (5)
    • 🌊TIL (9)
    • 💻CS (1)
      • 자료구조 (1)
    • 📙Language (9)
      • ☕Java (6)
      • 🤖Kotlin (3)
    • 🍃Spring (28)
    • 👨🏻‍💻알고리즘 (67)
      • 프로그래머스 (59)
      • 백준 (3)
    • 👷DevOps (4)
      • 🐳Docker (2)
      • 🤵Jenkins (1)

블로그 메뉴

  • 홈
  • Spring
  • Java
  • 알고리즘

공지사항

인기 글

태그

  • Connection
  • AOP
  • 트랜잭션 전파
  • SpringAOP
  • LeetCode
  • 스프링 시큐리티
  • mybatis
  • 스프링 부트
  • 다이나믹 프로그래밍
  • 코틀린
  • Open AI
  • spring
  • 트랜잭션
  • til
  • 완전탐색
  • CORS
  • 통합테스트
  • 스프링
  • resultset
  • kotlin
  • chat GPT
  • 힙
  • spring boot
  • 챗GPT
  • JDBC
  • BFS
  • Spring Security
  • kotest
  • sql
  • 스택

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
waveofmymind

기록하는 습관

[Spring] DTO를 사용하는 이유
🍃Spring

[Spring] DTO를 사용하는 이유

2023. 1. 22. 14:52

DTO란?

  • Data Transfer Object의 약자로,  계층간 데이터 교환을 위해 사용하는 객체이다.
  • DTO를 사용하지 않고, Controller에서 View를 뿌릴때 도메인 객체를 Model을 통해 View에 직접 전달할 수 있지만, 민감한 정보 등이 포함되어 노출될 우려가 있기 때문에 Model과 View가 강하게 결합되어 의존성이 생길 수 있다.
public class Member {
	public Long id;
    public String username;
    public String email;
    public String password; //외부에 노출되면 안됨
    public String info; //외부에 노출되면 안됨
}
@GetMapping
public ResponseEntity<Member> memberInfo(@PathVariable long memberId) {
    Member member = memberService.findById(memberId);
    return ResponseEntity.ok().body(member);
}

위처럼 Controller에서 @PathVariable로 받은 memberId의 정보를 바탕으로 도메인인 Member를 직접 넘겨주게 되면,

  • 도메인의 모든 속성이 외부에 노출된다.
    • 또한 Model 객체가 화면에서 사용하지 않을 불필요한 정보까지 보유하게 된다.
    • 비즈니스 로직 등, Member의 민감한 정보(password,info)가 외부에 노출될 수 있다. 
  • Model과 View가 강하게 결합되어, View와 Model의 의존관계가 형성될 수있다.
    • Member Entity의 코드가 변경될 경우, View의 UI에도 변경이 요구되어질 수 있기 때문이다.
public class MemberDto {

	public final String username;
    public final String email;

    public static MemberDto toDto(Member member) {
        return new MemberDto(member.getName(), member.getEmail());
    }
}
@GetMapping
public ResponseEntity<MemberDto> memberInfo(@PathVariable Long memberId) {
	Member member = memberService.findById(memberId);
    return ResponseEntity.ok().body(MemberDto.toDto(member));
}

그래서 위와 같이 DTO를 사용하게 되면 도메인 Model을 캡슐화하고, UI에서 사용하는 데이터만 선택적으로 보낼수 있으므로, 앞서 언급된 문제들을 해결할 수 있다.

'🍃Spring' 카테고리의 다른 글

[Spring DB] MyBatis 사용하기  (0) 2023.01.29
[Spring DB] 테스트 - 트랜잭션  (0) 2023.01.29
[Spring DB] JDBC Template 사용하기  (0) 2023.01.29
[Spring] Spring이란?  (0) 2023.01.28
[Spring] MapStruct  (0) 2023.01.23
    '🍃Spring' 카테고리의 다른 글
    • [Spring DB] 테스트 - 트랜잭션
    • [Spring DB] JDBC Template 사용하기
    • [Spring] Spring이란?
    • [Spring] MapStruct
    waveofmymind
    waveofmymind

    티스토리툴바