๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Study/Spring

[Spring] DTO, Entity, Mapper

by hong- 2022. 9. 6.

์•ˆ๋…•ํ•˜์„ธ์š” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž ํ™๋ฏผ์ •์ž…๋‹ˆ๋‹ค ๐Ÿซง

์˜ค๋Š˜์€ DTO, Entity๊ฐ€ ๋ฌด์—‡์ด๋ฉฐ Mapper๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 

๋˜ํ•œ ์ถ”๊ฐ€์ ์œผ๋กœ @Mapper ์• ๋„ˆํ…Œ์ด์…˜๊นŒ์ง€ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค !

์•Œ์•„๋ณด๊ธฐ์— ์•ž์„œ, ๊ทธ๋ฆผ์œผ๋กœ ์ดํ•ด๋˜๊ธฐ ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

 

 

โœ๐Ÿป Entity

 - ์‹ค์ œ DB์˜ ํ…Œ์ด๋ธ”๊ณผ ๋งค์นญ๋œ ํด๋ž˜์Šค

 - ํ…Œ์ด๋ธ”๊ณผ ์—ฐ๊ฒฐ๋  ํด๋ž˜์Šค์ž„์„ ๋‚˜ํƒ€๋ƒ„

 - DB ํ…Œ์ด๋ธ”์— ์กด์žฌํ•˜๋Š” ์ปฌ๋Ÿผ๋“ค์„ ํ•„๋“œ๋กœ ๊ฐ€์ง€๋Š” ๊ฐ์ฒด๋ฅผ ๋งํ•จ

    ์ฆ‰, ํ…Œ์ด๋ธ”์ด ๊ฐ€์ง€์ง€ ์•Š๋Š” ์ปฌ๋Ÿผ์„ ๊ฐ€์ ธ์„œ๋Š” ์•ˆ๋จ


โœ๐Ÿป DTO

 - Data Transfer Object, ๋ฐ์ดํ„ฐ ์ „์†ก ๊ฐ์ฒด

 - ํ”„๋กœ์„ธ์Šค ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฐ์ฒด

 - DB์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์–ป์–ด Service๋‚˜ Controller ๋“ฑ์œผ๋กœ ๋ณด๋‚ผ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ์ฒด

 - ๋กœ์ง์„ ๊ฐ€์ง€์ง€ ์•Š๊ณ  Getter/Setter ๋ฉ”์„œ๋“œ๋งŒ์„ ๊ฐ–๋Š” ์ˆœ์ˆ˜ํ•œ ๊ฐ์ฒด


๐Ÿ“ User์˜ ์žˆ๋Š” ์ •๋ณด๊ฐ€ Id, name, email, password ๊ฐ€ ์žˆ์„ ๋•Œ,

      * Password๋Š” ๊ด€๋ก€์ƒ, ์™ธ๋ถ€์— ๋…ธ์ถœ์ด ๋˜์„œ๋Š” ์•ˆ๋˜๋Š” ์ •๋ณด

 ๐Ÿ“Ž User.java

public class User {
    public Long id;
    public String password;
    public String name;
    public String email;
 }

 ๐Ÿ“Ž UserDto.java

public class UserDto {
    public Long id;
    public String name;
    public String email;
 }

๐Ÿ”Ž ์™œ DTO๋ฅผ ์“ธ๊นŒ?

 - ์™ธ๋ถ€์™€ ํ†ต์‹ ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์—๊ฒŒ ์žˆ์–ด ํ˜ธ์ถœ์€ ํฐ ๋น„์šฉ ! ์š”์ฒญ์— ๋”ฐ๋ผ ๋น„์šฉ์ด ์ฆ๊ฐ€ํ•จ

 - ๋•Œ๋ฌธ์— ํ•œ๋ฒˆ์˜ ์š”์ฒญ์— ๋” ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•ด์•ผ ํ•จ → ์ด๋ฅผ ์œ„ํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ์•„ ํ•œ ๋ฒˆ์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ํด๋ž˜์Šค์ธ DTO ์‚ฌ์šฉ


๐Ÿ”Ž DTO์™€ Entity๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ์ด์œ  : ๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ

 

  - Entity์˜ ๊ฐ’์ด ๋ณ€ํ•˜๋ฉด Repository์—์„œ DB ๊ฐ’์ด ๋ฐ˜์˜๋˜๊ณ  ์ด๋Š” ๋‹ค๋ฅธ ๋กœ์ง์—๋„ ์˜ํ–ฅ์„ ๋ฏธ์นจ

  - View์™€ ํ†ต์‹ ํ•˜๋ฉด์„œ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์ด ๋งŽ์€ DTO ํด๋ž˜์Šค๋ฅผ ๋ถ„๋ฆฌํ•ด์ฃผ์–ด์•ผ ํ•จ

 

์ฆ‰, DB์™€ ์ƒํ˜ธ์ž‘์šฉํ•  ๋•Œ์—๋Š” Entity ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉ

      Request, Response ์ฒ˜๋ฆฌํ•  ๋•Œ๋Š” DTO ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉ

 

์—ฌ๊ธฐ์„œ Entity → DTO๋กœ, DTO → Entity๋กœ ๋ณ€ํ™˜ํ•ด ์ฃผ๊ธฐ ์œ„ํ•ด MapStruct ๋ฅผ ์‚ฌ์šฉ !

 (ModelMapper ํด๋ž˜์Šค๋„ ์žˆ์ง€๋งŒ, ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” MapStruct ์‚ฌ์šฉ)


โœ๐Ÿป MapStruct 

 - DTO์™€ Entity ๊ฐ„ ๊ฐ์ฒด Mapping์„ ํŽธํ•˜๊ฒŒ ๋„์™€์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

๐Ÿ“Ž ์˜์กด์„ฑ ์ถ”๊ฐ€

implementation 'org.mapstruct:mapstruct:1.4.2.Final'
annotationProcessor 'org.mapstruct:mapstruct-processor:1.4.2.Final'

 - ์ž๋ฐ”์—์„œ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค๊ณ  @Mapper ์• ๋„ˆํ…Œ์ด์…˜์„ ๋ถ™์—ฌ์ฃผ๋ฉด ๋จ

 - ํ•„๋“œ ์ด๋ฆ„์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒ์„ฑ๋˜๋ฉฐ ๋งŒ์•ฝ ์ด๋ฆ„์ด ๋‹ค๋ฅด๋ฉด @Mapping(sourc="~" , target="~")์œผ๋กœ ์ง€์ •

@Mapper
public interface UserMapper {
    UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);
    
    @Mapping(target="id")
    UserEntity userDtoToEntity(UserDto dto);
    
    UserDto uwerEntityToDto(UserEntity entity);
   
 }

โœ๐Ÿป Mapper

 - Mapper ํด๋ž˜์Šค๋Š” DTO ํด๋ž˜์Šค์™€ ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค๋ฅผ ์„œ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ํด๋ž˜์Šค

    ์ฆ‰, DB์— ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์—”ํ‹ฐํ‹ฐ์— ๋งž๊ฒŒ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ๊ณผ์ •

 - ์˜์กด๊ด€๊ณ„๋Š” ์ตœ๋Œ€ํ•œ ์•ฝํ•˜๊ฒŒ ํ•จ

 - ์ปจํŠธ๋กค๋Ÿฌ์™€ ์„œ๋น„์Šค์˜ ์˜์กด์€ ๋น„์šฉ ๋ฌธ์ œ์—์„œ ์œ„ํ—˜ํ•จ 

    → ์„œ๋น„์Šค DTO๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ Mapper๋ฅผ ํ†ตํ•ด ์ƒํ˜ธ ๋ณ€ํ™˜ํ•˜์—ฌ ์˜์กด๊ด€๊ณ„๋ฅผ ์ค„์—ฌ ํ•ด๊ฒฐ

 ๐Ÿ“Ž Mapper XML

  - Mapper ์ธํ„ฐํŽ˜์ด์Šค๋งŒ์œผ๋กœ๋„ ์ถฉ๋ถ„ํžˆ SQL๋ฌธ์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•จ

     But, ๋ณต์žกํ•˜๊ณ  ๊ธธ์–ด์ง€๋Š” SQL ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” XML ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์Œ

'Study > Spring' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Spring] DAO / DTO / VO / Entity  (0) 2022.11.21
[Spring] ModelAndView ๊ฐ์ฒด  (0) 2022.11.18
[Spring] Annotation  (0) 2022.10.24
[Spring] JDBC์™€ JPA  (0) 2022.10.23
[Spring] Spring Data JPA์™€ QueryDSL  (1) 2022.10.08