๐Ÿ”ฅ TIL - Day 51

Kim Dae Hyunยท2021๋…„ 11์›” 9์ผ
1

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
61/93

๐Ÿ“Œ ๊ตฌํ˜„ ํ…Œ์ŠคํŠธ Spring -> Flask .. NoSQL -> RDBMS ๅฎŒ

๊ตฌํ˜„ ํ…Œ์ŠคํŠธ๋กœ ์ง„ํ–‰ํ•œ ๋ฉ”๋ชจ์žฅ ํ”„๋กœ์ ํŠธ๋ฅผ Flask์—์„œ Spring์œผ๋กœ ์˜ฎ๊ธฐ๋Š” ์ž‘์—…์„ ๋งˆ๋ฌด๋ฆฌํ–ˆ๋‹ค.
์–ด์ œ์˜ ์ฃผ์š” ์ด์Šˆ๋Š” Flask์—์„œ Spring์œผ๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ ์ด์—ˆ๊ณ  ์˜ค๋Š˜์€ NoSQL์—์„œ RDBMS์˜€๋‹ค.

์˜ค๋Š˜์˜ ๊ตฌํ˜„ ์ด์Šˆ ํ•˜๋‚˜๋ฅผ ์ •๋ฆฌํ•ด๋ณด์ž.

๐Ÿ“Œ Lazy ๋กœ๋”ฉ ํ”„๋ก์‹œ ์ดˆ๊ธฐํ™” ๋ฌธ์ œ

  • Memo์™€ User๋Š” ManyToOne ๊ด€๊ณ„์ด๊ณ  Lazy๋กœ ์„ค์ •๋˜์–ด ์žˆ๋‹ค.
  • ์ „์ฒด ๋ฉ”๋ชจ๋ฅผ ์กฐํšŒํ•˜๋Š” findAll() ์„ MemoService์—์„œ ํ˜ธ์ถœํ•˜๊ณ  ์—”ํ‹ฐํ‹ฐ ํƒ€์ž…์„ ๋ฐ˜ํ™˜ํ–ˆ๋‹ค.
  • MemoController์—์„œ๋Š” MemoService์—์„œ ๋ฆฌํ„ด๋ฐ›์€ ์—”ํ‹ฐํ‹ฐ ํƒ€์ž…์„ ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜ํ–ˆ๋‹ค.

๋ฌธ์ œ๋Š” ์—”ํ‹ฐํ‹ฐ๋ฅผ ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š”๋ฐ ์žˆ๋‹ค.
Fetch type์„ Lazy๋กœ ์„ค์ •ํ•˜๊ฒŒ ๋˜๋ฉด User๋ฅผ ์ง์ ‘ ์กฐํšŒํ•˜์ง€ ์•Š๋Š” ์ด์ƒ Memo์˜ User๋Š” ํ”„๋ก์‹œ ๊ฐ์ฒด๋กœ ์ดˆ๊ธฐํ™”๋œ๋‹ค. ์ผ๋‹จ ์—ฌ๊ธฐ์„œ๋Š” ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ NULL์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•œ ๋นˆ ๊ฐ์ฒด๋กœ ์ดํ•ดํ•ด๋„ ๋  ๊ฒƒ ๊ฐ™๋‹ค.

์ด๋ ‡๊ฒŒ ํ”„๋ก์‹œ๋กœ ์ดˆ๊ธฐํ™”๋œ User๋ฅผ Jsonํ˜•ํƒœ๋กœ ๋ฆฌํ„ดํ•˜๋ ค๊ณ  ํ•˜๋‹ˆ ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ ๊ฒƒ์ด๋‹ค.

2๊ฐ€์ง€ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

  • ํ”„๋ก์‹œ๋ฅผ ์ง์ ‘ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค. (getter๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์ดˆ๊ธฐํ™”)
  • DTO๋กœ ๋ณ€ํ™˜ํ•ด์„œ ํ•„์š”ํ•œ ํ•„๋“œ๋งŒ ๋ฆฌํ„ดํ•œ๋‹ค. (๋” ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋ผ ์ƒ๊ฐ๋จ)

์ฒซ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ User์˜ ์•„๋ฌด ํ•„๋“œ์˜ Getter๋ฅผ ํ˜ธ์ถœํ•ด์„œ ํ”„๋ก์‹œ๋ฅผ ๊ฐ•์ œ๋กœ ์ดˆ๊ธฐํ™”์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
๋‚˜๋Š” Getter๋กœ ํ”„๋ก์‹œ๋ฅผ ์ฐ”๋Ÿฌ์„œ ๊นจ์šด๋‹ค ๋ผ๊ณ  ์ดํ•ดํ–ˆ๋‹ค.

๋‘๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ ์กฐํšŒ๋œ ์—”ํ‹ฐํ‹ฐ์˜ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ DTO๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
์ด ๋ฐฉ๋ฒ•์€ Lazy ๋กœ๋”ฉ์—์„œ ํ”„๋ก์‹œ ์ดˆ๊ธฐํ™” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋™์‹œ์— ํ•„์š”ํ•œ ํ•„๋“œ๋งŒ์„ API ์ŠคํŽ™์— ๋”ฑ ๋งž๊ฒŒ ๋ฆฌํ„ดํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

๋‘๋ฒˆ์งธ ๋ฐฉ๋ฒ•์„ ์ ์šฉํ•ด๋ดค๋‹ค.
์กฐํšŒํ•œ Memo๋ฅผ ์•„๋ž˜ DTO๋กœ ๋ณ€ํ™˜ํ•ด์„œ ํด๋ผ์ด์–ธํŠธ๋กœ ๋‚ด๋ ค์คฌ๋‹ค.
์ด ๋•Œ ์กฐํšŒ๋˜ Memo๊ฐ€ Pageํƒ€์ž…์ด์—ฌ์„œ ์‚ด์ง ๊ณ ๋ฏผ์„ ํ–ˆ๋Š”๋ฐ ๊ทธ๋ƒฅ DTO์— ํ˜„์žฌ ํŽ˜์ด์ง•์— ํ•„์š”ํ•œ ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค.

@NoArgsConstructor
@Builder
@Data
@AllArgsConstructor
public class MemoListDto {

    private List<MemoDto> memos;

    private int page;
    private int size;
    private int totalPages;
}


@Builder
@AllArgsConstructor
@Data
public class MemoDto {

    private Long id;
    private String title;
    private String contents;
    private Long clickCount;
    private String username;
    private LocalDateTime createdAt;
    private List<String> comments = new ArrayList<>();
}

Entity -> DTO

        List<MemoDto> memoDtos = memos.stream().map(m -> {
            return MemoDto.builder()
                    .id(m.getId())
                    .title(m.getTitle())
                    .contents(m.getContents())
                    .clickCount(m.getClickCount())
                    .username(m.getIsAnonymous() ? "๋น„ํšŒ์›" : m.getUser().getUsername())
                    .createdAt(m.getCreatedAt()).build();
        }).collect(Collectors.toList());


        MemoListDto memoList = MemoListDto.builder()
                .memos(memoDtos)
                .page(memos.getNumber())
                .size(memos.getSize())
                .totalPages(memos.getTotalPages()).build();

        return memoList;

์‚ฌ์‹ค ์ด ๋ถ€๋ถ„์ด JPA์—์„œ ๊ต‰์žฅํžˆ ์ค‘์š”ํ•˜๊ณ  ์‰ฝ๊ฒŒ ๋งˆ์ฃผํ•˜๋Š” ์—๋Ÿฌ๋ผ๊ณ  ํ•ด์„œ ์˜ˆ์ „์— ๊ณต๋ถ€ํ–ˆ์—ˆ๋Š”๋ฐ ๋ฐ”๋กœ ๊นŒ๋จน์—ˆ๋‹ค ใ…Ž ์ด๋ ‡๊ฒŒ ์‹ค์ „์œผ๋กœ ๋ณต์Šต์„ ํ•ด์„œ ๋‹คํ–‰์ด๋‹ค...

profile
์ข€ ๋” ์ฒœ์ฒœํžˆ ๊นŒ๋จน๊ธฐ ์œ„ํ•ด ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ๐Ÿง

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