[Spring] DTO

strongmhkยท2023๋…„ 7์›” 22์ผ
0

Spring

๋ชฉ๋ก ๋ณด๊ธฐ
21/25
post-thumbnail

๐Ÿ“ŒDTO?

DTO๋ž€ Data Transfer Object๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
์ง์—ญ์„ ํ•ด๋ณด๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ์˜ฎ๊ธฐ๋Š” Object์ด๋‹ค.
๊ฐ ํด๋ž˜์Šค๋ฅผ ์ด๋™ํ•  ๋•Œ๋งˆ๋‹ค DTO๋ผ๋Š” ์ด๋™์ˆ˜๋‹จ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์˜ฎ๊ธด๋‹ค.

DTO๋ฅผ ์ฒ˜์Œ ๋ณธ๊ฑด Controller์—์„œ Client์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ฒจ์ค„๋•Œ์ด๋‹ค.
์‰ฝ๊ฒŒ๋Š” DB์—์„œ ๋„์ง‘์–ด๋‚ธ ๊ฐ์ฒด ๊ทธ ๋ชจ๋‘๋ฅผ ์ „์†กํ•  ์ˆ˜ ๋Š”์—†๋‹ค.
์œ ์ €์˜ ๊ฐ์ฒด๋ฅผ ๊บผ๋ƒˆ๋‹ค๋ฉด ์•„์ด๋”” ๋น„๋ฐ€๋ฒˆํ˜ธ ๋“ฑ ๊ฐœ์ธ์ •๋ณด๊ฐ€ ๋ชจ๋‘ ๋“ค์–ด์žˆ์„๊ฑด๋ฐ ๊ทธ๊ฒƒ์„ ํ•„์š”ํ•œ ๊ฒƒ๋งŒ ๋‹ด์•„์„œ ๋ณด๋‚ด์•ผํ•œ๋‹ค๋Š”๊ฒƒ์ด๋‹ค.

๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ €๊ฐ์ฒด๋ฅผ ๊บผ๋‚ด์„œ ๊ทธ์ค‘ ํ•„์š”ํ•œ ๊ฒƒ๋งŒ ๋ณ€์ˆ˜์— ๋‹ด์•„์„œ ๋ณด๋‚ด๋Š” ๊ฒƒ์ด๋ผ ๋‹จ์ˆœํ•˜๊ฒŒ ์ƒ๊ฐํ• ์ˆ˜์žˆ๋‹ค.

Controller, Service, Repository์˜ ์ด๋™์„ ์—”ํ‹ฐํ‹ฐ = Domain์˜ ํ‹€๋กœ ์ด๋™ํ•œ๋‹คํ–ˆ๋Š”๋ฐ DB์— ์ „์†ก๋˜๋Š” ๊ฐ€์žฅ ์ค‘์š”ํ•œํ‹€์— Controller, Service, Repository์ด๋™ํ•˜๋‹ค๋ณด๋ฉด ๋‹ค๋ฅธ ๋กœ์ง์ด ์ฒจ๊ฐ€๋  ์ˆ˜๊ฐ€ ์žˆ๋‹ค๋Š”๊ฒƒ์ด๋‹ค. ์ž์„ธํžˆ ์•Œ์•„๋ณด์ž.







๐Ÿ“ŒDTO๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ?


  • View Layer์™€ DB Layer์˜ ์—ญํ• ์„ ๋ถ„๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ
    -> ๊ฐ์ฒด๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ๊ณ„์ธต๊ณผ ์ €์žฅํ•˜๋Š” ๊ณ„์ธต์˜ ์—ญํ• ์„ ๋ถ„๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ DTO๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

  • Entity ๊ฐ์ฒด์˜ ๋ณ€๊ฒฝ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•˜์—ฌ
    -> Entity ๊ฐ์ฒด๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ฉด ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ์˜๋„์™€ ๋‹ค๋ฅด๊ฒŒ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€์งˆ๋  ์ˆ˜ ์žˆ๋‹ค.

  • View์™€ ํ†ต์‹ ํ•˜๋Š” DTO ํด๋ž˜์Šค๋Š” ์ž์ฃผ ๋ณ€๊ฒฝ๋œ๋‹ค
    -> View(ํด๋ผ์ด์–ธํŠธ)์™€ ํ†ต์‹ ํ•˜๋Š” DTO ํด๋ž˜์Šค, ์˜ˆ๋ฅผ ๋“ค์–ด ResponseDTO, RequestDTO๋Š” ์š”๊ตฌ์‚ฌํ•ญ์— ๋”ฐ๋ผ ์ž์ฃผ ๋ณ€๊ฒฝ๋œ๋‹ค. ์–ด๋–ค ์š”์ฒญ์—์„œ๋Š” ํŠน์ • ๊ฐ’์ด ์ถ”๊ฐ€๋  ์ˆ˜๋„ ์žˆ๊ณ , ํŠน์ •๊ฐ’์ด ์—†์„ ์ˆ˜๋„ ์žˆ๋‹ค.
    ๋”ฐ๋ผ์„œ Entity ํด๋ž˜์Šค์™€ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ด€๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.

  • ๋„๋ฉ”์ธ ๋ชจ๋ธ๋ง์„ ์ง€ํ‚ค๊ธฐ ์œ„ํ•˜์—ฌ
    -> ๋„๋ฉ”์ธ ์„ค๊ณ„๋ฅผ ์ž˜ํ•˜์˜€๋‹ค๊ณ  ํ•˜๋”๋ผ๋„ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ๊ฐ€ ์‰ฝ์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค.
    ์˜ˆ๋ฅผ ๋“ค์–ด Entity ํด๋ž˜์Šค์˜ ํŠน์ • ์ปฌ๋Ÿผ๋“ค์„ ์กฐํ•ฉํ•˜์—ฌ ํŠน์ • ํฌ๋งท์„ ์ถœ๋ ฅํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ํ•˜์ž.
    Entity ํด๋ž˜์Šค์— ํ‘œํ˜„์„ ์œ„ํ•œ ํ•„๋“œ๋‚˜ ๋กœ์ง์ด ์ถ”๊ฐ€๋˜๋ฉด ๊ฐ์ฒด ์„ค๊ณ„๋ฅผ ๋ง๊ฐ€๋œจ๋ฆด ์ˆ˜ ์žˆ๋‹ค.
    ๋”ฐ๋ผ์„œ DTO์— ํ‘œํ˜„์„ ์œ„ํ•œ ๋กœ์ง์„ ์ถ”๊ฐ€ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด Entity์˜ ๋„๋ฉ”์ธ ๋ชจ๋ธ๋ง์„ ์ง€ํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.




๐ŸŽˆ์˜ˆ์‹œ

Entity

public class User {

    public Long id;
    public String name;
    public String email;
    public String password; //์™ธ๋ถ€์— ๋…ธ์ถœ๋˜์„œ๋Š” ์•ˆ ๋  ์ •๋ณด
    public DetailInformation detailInformation; //์™ธ๋ถ€์— ๋…ธ์ถœ๋˜์„œ๋Š” ์•ˆ ๋  ์ •๋ณด

    //๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง, getter, setter ๋“ฑ ์ƒ๋žต
}

Controller

@GetMapping
public ResponseEntity<User> showArticle(@PathVariable long id) {
   User user = userService.findById(id);
   return ResponseEntity.ok().body(user);
   // ์ด๋ ‡๊ฒŒ return ํ•ด์ฃผ๋ฉด password๊นŒ์ง€ ๋‹ค ๋„˜์–ด๊ฐ„๋‹ค
}



๐ŸŽˆDTO๋ฅผ ํ†ตํ•œ ๊ฐœ์„ 

DTO

public class UserDto {

    public final long id;
    public final String name;
    public final String email;

    //์ƒ์„ฑ์ž ์ƒ๋žต

    public static UserDto from(User user) {
        return new UserDto(user.getId(), user.getName(), user.getEmail());
    }
}

Controller

@GetMapping
public ResponseEntity<UserDto> showArticle(@PathVariable long id) {
    User user = userService.findById(id);
    return ResponseEntity.ok().body(UserDto.from(user));
    // ํ•„์š”ํ•œ๊ฒƒ๋งŒ ๋‹ด์•„์„œ ๋ณด๋‚ด๋Š” DTO๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•˜๋ฉด ํ•„์š”ํ•œ๊ฒƒ๋งŒ ๋ณด๋‚ผ์ˆ˜์žˆ๋‹ค. 
}
profile
์ € ์ปค์„œ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ ๋ž˜์š”!

0๊ฐœ์˜ ๋Œ“๊ธ€