일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 프로그래머스 이중우선순위큐
- @FeignClient
- 빈 조회 2개 이상
- infcon 2024
- 항해99
- 개발자부트캠프추천
- 디자인패턴
- JavaScript
- 취업리부트코스
- 단기개발자코스
- 전략패턴 #StrategyPattern #디자인패턴
- 빈 충돌
- Python
- jwttoken
- Spring multimodule
- KPT회고
- 파이썬
- 디자인 패턴
- DesignPattern
- 1주일회고
- 구글 OAuth login
- 개발자 취업
- 프로그래머스
- jwt
- 인프콘 2024
- 커스텀 헤더
- 99클럽
- spring batch 5.0
- TiL
- 코딩테스트 준비
- Today
- Total
m1ndy5's coding blog
Entity 대신 DTO를 반환해야하는 이유 본문
프로젝트를 진행하던 중 궁금한 점이 생겼다.
Post라는 게시글 Entity가 가지고 있는 필드는
postId: 포스트 아이디
member : 작성자
title: 게시글 제목
content: 게시글 내용
likes: 좋아요 개수
createDate: 작성 일자
updateDate: 수정 일자
이렇게 가지고 있었다.
이에 따라 게시글을 조회하는 컨트롤러에서 귀찮게 DTO를 만들지 않고 그냥 Post Entity자체를 응답으로 내려줘도 되지 않을까? 라는 생각을 해서 주변 개발자분들께 여쭤봤고 욕을 먹었더라는(?)ㅋㅋㅋㅋㅋ
나와 같은 생각을 가지고 있을 꼬꼬마 개발자분들께 왜 굳이 DTO로 반환하는지에 대한 글을 공유하려고 한다!
일단 글에 들어가기 앞서 DTO가 무엇인지부터 알고 가보자
DTO란?
Data Transfer Object의 줄임말로 해석하자면 데이터 전송 객체 이다.
즉 전송될 데이터를 담고있는 객체라고 생각하면 된다.
그렇다면 DTO는 언제 사용이 될까?
데이터를 주고 받을 때 전부 사용이 된다고 생각하면 되는데
예를 들어서 우리가 게시글을 클릭할 때 서버에 게시글 좀 보여줘라고 요청을 하게 되고
서버는 오케이 하고 해당 게시글의 제목, 내용, 작성자, 작성 일자 등등의 내용을 보내줄 때 이를 DTO에 담아 리턴하게 되는 것이다.
Entity 반환 대신 DTO를 사용해야하는 이유
1. Database Table의 구조가 노출될 수 있음
Database Table의 구조가 노출될 시 SQL injection과 같은 공격을 겪을 수 있는 확률이 올라간다.
SQL injection이란 악의적인 사용자가 보안상의 취약점을 이용하여 임의의 SQL 문을 주입하고 실행되게 하여 데이터베이스가 비정상적인 동작을 하도록 조작하는 행위이다.
SQL injection을 수행하기 위해서는 데이터베이스의 정보(테이블명, 컬럼명 등)이 필요한데 DTO에 이 모든걸 담아서 보냈다면 컬럼명이 모두 노출될 수 있기 때문이다.
또한 password와 같은 극비의 컬럼값 또한 노출될 수 있으므로 DTO를 사용해주는 것이 좋다.
2. 컬럼 변경 및 API 스펙이 변경될 수 있음
예를 들어서 원래 게시글에 처음 작성된 날짜와 수정된 날짜가 다 보였다고 가정해보자
근데 수정된 날짜는 안보여줄거라고 변경이 되거나 익명으로 할거라 작성자 정보는 필요가 없어졌다고 했을 때
필요하지 않은 정보들은 응답의 복잡성만 증가시키기 때문에 제외하고 보내는 것이 가장 좋다.
만약 Entity를 반환했다면 다시 새로운 DTO를 만들어 주어야할 것이고 리턴을 모두 새로운 DTO로 하게끔 코드를 변경해야하지만
DTO를 사용했다면 필요없는 필드는 지워주고 이에 맞게 코드를 삭제해주면 될 것이다!
변경은 빈번하게 일어나는 행위이므로 설계 변경이 일어날 때 최소한의 코드 변경만 일어나게끔 하는 것이 가장 좋다.
3. JPA 양방향 무한 참조 문제가 발생할 수 있음
member과 post는 일대다 관계를 가지고 있고 @OneToMany와 @ManyToOne과 같은 어노테이션을 사용했을 것이다.
이 때 post을 불러오면 양방향으로 매핑이 된 member가 불러와질 것이고 또 member는 post를, 다시 post는 member을..
이런식으로 무한 참조가 되는 현상을 양방향 무한 참조라고 한다.
물론 @JsonIgnoreProperties({"post"}) 를 사용하여 Json 파싱시 post에 의해 불러온 member일 때 무시해도 되지만 위와 같은 이유로 이 어노테이션을 사용하는 것보다 Entity 대신 DTO를 사용하는 것이 좋다.
'백엔드 with java > spring' 카테고리의 다른 글
JWT Login과 Cookie (feat. Redirect) (0) | 2024.05.19 |
---|---|
About Setter (feat. Builder) (0) | 2024.01.17 |
UnsatisfiedDependencyException (feat.영한님 강의) (2) | 2023.12.05 |
Spring Security UserDetails, UserDetailsService (1) | 2023.10.11 |
Jackson & Constructor (0) | 2023.07.11 |