Spring/๐Ÿ”ฅ[spring]์ฝ”๋“œ๋กœ ๋ฐฐ์šฐ๋Š” ์Šคํ”„๋ง ๋ถ€ํŠธ ์›น ํ”„๋กœ์ ํŠธ_๊ตฌ๋ฉ๊ฐ€๊ฒŒ ์ฝ”๋”ฉ๋‹จ

Part2. ๋‹จ์ผ ํ•ญ๋ชฉ ๊ฒ€์ƒ‰ ํ…Œ์ŠคํŠธ

1son 2023. 2. 24. 14:11

์˜ˆ์ œ๋กœ ์ œ๋ชฉ์— 1์ด๋ผ๋Š” ๊ธ€์ž๊ฐ€ ์žˆ๋Š” ์—”ํ‹ฐํ‹ฐ๋“ค์„ ๊ฒ€์ƒ‰ํ•ด๋ณด๋ฉด 

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

@Test
    public void testQuery1(){
        PageRequest pageable = PageRequest.of(0,10, Sort.by("gno").descending());

        QGuestbook qGuestbook = QGuestbook.guestbook; //1

        String keyword="1";

        BooleanBuilder builder = new BooleanBuilder(); //2

        BooleanExpression expression = qGuestbook.title.contains(keyword); //3

        builder.and(expression); //4

        Page<Guestbook> result = guestbookRepository.findAll((Predicate) builder, (org.springframework.data.domain.Pageable) pageable); //5

        result.stream().forEach(guestbook -> {
            System.out.println(guestbook);
        });

    }

์ด๋ฅผ ํ†ตํ•ด์„œ ํŽ˜์ด์ง€ ์ฒ˜๋ฆฌ์™€ ๋™์‹œ์— ๊ฒ€์ƒ‰ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค. 

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฟผ๋ฆฌ๊ฐ€ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

Hibernate: 
    select
        guestbook0_.gno as gno1_0_,
        guestbook0_.moddate as moddate2_0_,
        guestbook0_.regdate as regdate3_0_,
        guestbook0_.content as content4_0_,
        guestbook0_.title as title5_0_,
        guestbook0_.writer as writer6_0_ 
    from
        guestbook guestbook0_ 
    where
        guestbook0_.title like ? escape '!' 
    order by
        guestbook0_.gno desc limit ?
Hibernate: 
    select
        count(guestbook0_.gno) as col_0_0_ 
    from
        guestbook guestbook0_ 
    where
        guestbook0_.title like ? escape '!'

์‹คํ–‰๋˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋ฉด ์ค‘๊ฐ„์— where ์กฐ๊ฑด์ ˆ์—์„œ title์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ์˜จ์ „ํžˆ ์ง„ํ–‰๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

 

4.4 ์„œ๋น„์Šค ๊ณ„์ธต๊ณผ DTO

 

์‹ค์ œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ž‘์„ฑํ•  ๊ฒฝ์šฐ์— ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๋ฅผ ์˜์† ๊ณ„์ธต ๋ฐ”๊นฅ์ชฝ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹ ๋ณด๋‹ค๋Š”

DTO(Data Transfer Object)๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. 

 

DTO๋Š” ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด์™€ ๋‹ฌ๋ฆฌ ๊ฐ ๊ณ„์ธต๋ผ๋ฆฌ ์ฃผ๊ณ ๋ฐ›๋Š” ์šฐํŽธ๋ฌผ์ด๋‚˜ ์ƒ์ž์˜ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค. 

์ˆœ์ˆ˜ํ•˜๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๊ณ  ์žˆ๋‹ค๋Š” ์ ์—์„œ๋Š” ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ, ๋ชฉ์ ์ž์ฒด๊ฐ€ ๋ฐ์ดํ„ฐ์˜ ์ „๋‹ฌ์ด๋ฏ€๋กœ 

์ฝ๊ณ , ์“ฐ๋Š” ๊ฒƒ์ด ๋ชจ๋‘ ํ—ˆ์šฉ๋˜๋Š” ์ ์ด ๊ฐ€๋Šฅํ•˜๊ณ 

์ผํšŒ์„ฑ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์„ฑ๊ฒฉ์ด ๊ฐ•ํ•ฉ๋‹ˆ๋‹ค. 

 

JPA๋ฅผ ์ด์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๋Š” ๋‹จ์ˆœํžˆ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๋Š” ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ

์‹ค์ œ ๋Œ€์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๊ด€๋ จ์ด ์žˆ๊ณ , ๋‚ด๋ถ€์ ์œผ๋กœ ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. 

 

์˜ˆ์ œ์—์„œ๋Š” ์„œ๋น„์Šค ๊ณ„์ธต์„ ์ƒ์„ฑํ•˜๊ณ  ์„œ๋น„์Šค ๊ณ„์ธต์—์„œ๋Š” 

DTO๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ๋ฆฌํ„ด ํƒ€์ž…์„ ์ฒ˜๋ฆฌํ•˜๋„๋ก ๊ตฌ์„ฑํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. 

 

ํ”„๋กœ์ ํŠธ ๋‚ด์— dtoํŒจํ‚ค์ง€์™€ service ํŒจํ‚ค์ง€๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. 

dtoํŒจํ‚ค์ง€์—๋Š” ์„œ๋น„์Šค ๊ณ„์ธต์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ๋ฆฌํ„ด ํƒ€์ž…์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” GuestbookDTO ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. 

 

package org.zerock.guestbook.dto;


import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;

@Builder
@NoArgsConstructor
@AllArgsConstructor
@Data
public class GuestbookDTO {
    
    private Long gno;
    private String title;
    private String content;
    private String writer;
    private LocalDateTime regDate, modDate;
    
}

์ž‘์„ฑ๋œ GuestbookDTO๋Š” ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค์ธ Guestbook๊ณผ ๊ฑฐ์˜ ๋™์ผํ•œ ํ•„๋“œ๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , getter/setter๋ฅผ ํ†ตํ•ด ์ž์œ ๋กญ๊ฒŒ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ฒŒ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. 

 

์„œ๋น„์Šค ๊ณ„์ธต์—์„œ๋Š” 

GuestbookDTO๋ฅผ ์ด์šฉํ•ด์„œ ํ•„์š”ํ•œ ๋‚ด์šฉ์„ ์ „๋‹ฌ๋ฐ›๊ณ , ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ

GuestbookService ์ธํ„ฐํŽ˜์ด์Šค์™€ GuestbookServiceImplํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. 

 

 

๊ฐ€์žฅ๋จผ์ € GuestbookDTO๋ฅผ ์ด์šฉํ•ด์„œ

์ƒˆ๋กœ์šด '๋ฐฉ๋ช…๋ก'์„ ๋“ฑ๋กํ•˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. 

 

package org.zerock.guestbook.service;


import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Service;
import org.zerock.guestbook.dto.GuestbookDTO;

@Service
@Log4j2
public class GuestbookServiceImpl implements GuestbookService{
    
    @Override
    public Long register(GuestbookDTO dto){
        return null;
    }
    
}

GuestbookServiceImpl ํด๋ž˜์Šค์—๋Š” ์Šคํ”„๋ง์—์„œ ๋นˆ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋„๋ก @Service ์–ด๋…ธํ…Œ์ด์…˜์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. 

 

 

4.4.1 ๋“ฑ๋ก๊ณผ DTO๋ฅผ ์—”ํ‹ฐํ‹ฐ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ 

 

 

 

 

 

https://link.coupang.com/a/UtQhs

 

์ฝ”๋“œ๋กœ ๋ฐฐ์šฐ๋Š” ์Šคํ”„๋ง ๋ถ€ํŠธ ์›น ํ”„๋กœ์ ํŠธ

COUPANG

www.coupang.com

 

"์ด ํฌ์ŠคํŒ…์€ ์ฟ ํŒก ํŒŒํŠธ๋„ˆ์Šค ํ™œ๋™์˜ ์ผํ™˜์œผ๋กœ, ์ด์— ๋”ฐ๋ฅธ ์ผ์ •์•ก์˜ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ์ œ๊ณต๋ฐ›์Šต๋‹ˆ๋‹ค."