๐Ÿ“• Spring Framework/Spring Project

์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง [1]

GroovyArea 2022. 8. 3. 23:41
์ง€๋‚œ 1์ฃผ์ผ๊ฐ„ ๊ธฐ์กด ํ”„๋กœ์ ํŠธ์˜ ๋ฆฌํŒฉํ„ฐ๋ง์„ ์œ„ํ•ด ์ƒˆ๋กœ์šด ์ €์žฅ์†Œ๋ฅผ ์ƒ์„ฑํ–ˆ๋‹ค.

์•„ํ‚คํ…์ฒ˜ ๋ถ€๋ถ„ ์„ค๊ณ„๋ฅผ ๊ฑฐ์˜ 2, 3์ผ์€ ํ•œ ๊ฒƒ ๊ฐ™๋‹ค. ์•„์ง ์ˆ˜์ •์ด ํ•„์š”ํ•˜๊ฒ ์ง€๋งŒ, ํ•ญ์ƒ ๊ณ ๋ฏผํ•ด๋ณด์ž.

๊ธฐ์กด ํ”„๋กœ์ ํŠธ๋Š” multi module๋กœ ์ง„ํ–‰ํ–ˆ์ง€๋งŒ, ์™„๋ฒฝํ•œ ๋ฉ€ํ‹ฐ ๋ชจ๋“ˆ ํ”„๋กœ์ ํŠธ ์ด์ง„ ์•Š์•˜๋‹ค. 
๋ชจ๋†€๋ฆฌํ‹ฑ์œผ๋กœ ๊ฐˆ์ง€, MSA๋ฅผ ๊ณ ๋ คํ•ด ๋ชจ๋“ˆ๊ฐ„ ๋ถ„๋ฆฌ๋ฅผ ํ• ์ง€๊ฐ€ ๊ณ„์† ๊ณ ๋ฏผ๋œ๋‹ค..

ํ™•์žฅ์„ฑ์„ ์œ„ํ•ด ๋ชจ๋“ˆ, ํŒจํ‚ค์ง€๊ฐ„ ์˜์กด์„ฑ ๋ถ„๋ฆฌ๋ฅผ ํ‹ˆํ‹ˆ์ด ๊ณ ๋ คํ•ด๋ด์•ผ๊ฒ ๋‹ค.

๊ธฐ์กด ์ž‘์„ฑ ์ฝ”๋“œ๋ฅผ ์˜ฎ๊ธฐ๋ฉฐ ์กฐ๊ธˆ ๋” ํด๋ฆฐํ•œ ๊ฐ์ฒด์ง€ํ–ฅ์ ์ธ ์ฝ”๋“œ๋กœ ๋ฆฌ๋ทฐ์–ด๋‹˜์˜ ํ”ผ๋“œ๋ฐฑ์„ ํ†ตํ•ด ์ˆ˜์ •ํ•ด๋‚˜๊ฐ”๋‹ค.

๋งŽ์ด ์•Œ๊ณ  ์žˆ์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ ๋ถ€๋ถ„์—์„œ๋„ ํ—›์ ์ด ์žˆ์—ˆ๊ณ , ์ „ํ˜€ ์•Œ์ง€ ๋ชปํ–ˆ๋˜ ๋””ํ…Œ์ผํ•œ ๋ถ€๋ถ„๋„ ์•Œ์•„๋‚˜๊ฐ€๋Š” ์ค‘์ด๋‹ค.

์ธ์ฆ ๋ฐ ์ธ๊ฐ€ ๋ถ€๋ถ„์€ ๊ธฐ์กด ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์†์ˆ˜ ๊ตฌํ˜„ํ–ˆ์ง€๋งŒ, ์ด๋ฒˆ์—๋Š” Spring Security๋ฅผ ์ด์šฉํ•ด ๋ณผ ์ƒ๊ฐ์ด๋‹ค. 
ํ•œ๋ฒˆ ์†์ˆ˜ ๊ฒฝํ—˜ํ•œ ๊ฒƒ์— ๋Œ€ํ•œ ๋ณด์™„์ ์„ ์ž˜ ๋งŒ๋“ค์–ด์ง„ Framework๋ฅผ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ๋ฉ”๊ฟ”๋ณด๊ณ  ์‹ถ๋‹ค.

๊ธฐ์กด์— Persistence Layer๋ฅผ Mybatis๋ฅผ ์ด์šฉํ•œ Sql Mapper๋ฅผ ์ด์šฉํ•ด์„œ ๊ตฌํ˜„ํ–ˆ๋‹ค. ํ”„๋กœ์ ํŠธ 2๊ฐœ๋ฅผ ๊ฒฝํ—˜ํ–ˆ์—ˆ๋‹ค.
์ด๋ฒˆ์—” JPA๋ฅผ ์ด์šฉํ•ด์„œ ORM์œผ๋กœ ๊ฐ์ฒด์ง€ํ–ฅ์  ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด๊ณ  ์‹ถ์€ ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.

๋ฆฌํŒฉํ„ฐ๋ง ํ•œ ๋ถ€๋ถ„๊ณผ ์ƒˆ๋กœ ์•Œ๊ฒŒ ๋œ ์ ์„ ๋‚˜์—ดํ•ด๋ณด๊ฒ ๋‹ค.  

Model

๊ฐ์ฒด๋Š” Request, Response์— ๋”ฐ๋ผ ์ฑ…์ž„์„ ๋‚˜๋ˆ„์–ด ๊ฐ™์€ ๋ชจ๋ธ์ด๋ผ๋„ ๋”ฐ๋กœ ๋‚˜๋ˆ„์–ด ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

 > ์ด๋Ÿฐ ์‹์œผ๋กœ ํ•˜๋‚˜์˜ ๋ชจ๋ธ์„ ํ†ตํ•ฉํ•ด์„œ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์ƒ๊ธธ ๋•Œ ๊ฐ€๋ณ€์„ฑ์„ ๋„๊ฒŒ ๋  ์ˆ˜๋„ ์žˆ๋‹ค. ๋‹น์—ฐํžˆ ์œ ์ง€๋ณด์ˆ˜์— ๋ถ€์ ํ•ฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๊ฐœ์˜ ๋ชจ๋ธ๋กœ ๋ถ„๋ฆฌํ–ˆ๋‹ค.

Utility

์œ ํ‹ธ๋ฆฌํ‹ฐ๋กœ ์‚ฌ์šฉํ•  ํด๋ž˜์Šค๋Š” ๋ชจ๋“  ๋„๋ฉ”์ธ์—์„œ ์ด์šฉ์ด ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค. ์ข…์†์„ฑ์„ ๋„๋ฉด ์•ˆ ๋œ๋‹ค.

public class CookieUtil {

    private static final String COOKIE_KEY = "Chicken";
    private static final String ENC_TYPE = "utf-8";

    private CookieUtil() {
    }

    /* ์นดํŠธ ์ฟ ํ‚ค ๋ฐ˜ํ™˜ ๋ฉ”์„œ๋“œ */
    public static Optional<Cookie> getCartCookie(Cookie[] requestCookies) {
        return Arrays.stream(requestCookies)
                .filter(cookie -> cookie.getName().equals(COOKIE_KEY))
                .findFirst();
    }

    /* ์นดํฌ ์ฟ ํ‚ค ๊ฐ’ ๋””์ฝ”๋”ฉ ํ›„ map ๊ฐ์ฒด ๋ฐ˜ํ™˜ ๋ฉ”์„œ๋“œ */
    public static Map<Integer, CartItemDTO> getCartItemDTOMap(Cookie responseCartCookie) throws UnsupportedEncodingException {
        String cookieValue = responseCartCookie.getValue();
        return JsonUtil.stringToMap(URLDecoder.decode(cookieValue, ENC_TYPE), Integer.class, CartItemDTO.class);
    }

    /**
     * ์นดํŠธ ์•ˆ์˜ ์ƒํ’ˆ ๋ฒˆํ˜ธ ๋ฐฐ์—ด ๋ฐ˜ํ™˜ ๋ฉ”์„œ๋“œ
     *
     * @param responseCartCookie ์‘๋‹ต ์นดํŠธ ์ฟ ํ‚ค
     * @return ์ƒํ’ˆ ๋ฒˆํ˜ธ ๋ฐฐ์—ด
     * @throws UnsupportedEncodingException ์ธ์ฝ”๋”ฉ ์˜ˆ์™ธ
     */
    public static Integer[] getItemNoArr(Cookie responseCartCookie) throws UnsupportedEncodingException {
        return Arrays.stream(getCartArr(responseCartCookie))
                .map(CartItemDTO::getProductNo)
                .toArray(Integer[]::new);
    }

    /**
     * ์นดํŠธ ์•ˆ์˜ ์ƒํ’ˆ ์ด๋ฆ„ ๋ฐฐ์—ด ๋ฐ˜ํ™˜ ๋ฉ”์„œ๋“œ
     *
     * @param responseCartCookie ์‘๋‹ต ์นดํŠธ ์ฟ ํ‚ค
     * @return ์ƒํ’ˆ ์ด๋ฆ„ ๋ฐฐ์—ด
     * @throws UnsupportedEncodingException ์ธ์ฝ”๋”ฉ ์˜ˆ์™ธ
     */
    public static String[] getItemNameArr(Cookie responseCartCookie) throws UnsupportedEncodingException {
        return Arrays.stream(getCartArr(responseCartCookie))
                .map(CartItemDTO::getProductName)
                .toArray(String[]::new);
    }

    /**
     * ์นดํŠธ ์•ˆ์˜ ์ƒํ’ˆ ์žฌ๊ณ ๋Ÿ‰ ๋ฐฐ์—ด ๋ฐ˜ํ™˜ ๋ฉ”์„œ๋“œ
     *
     * @param responseCartCookie ์‘๋‹ต ์นดํŠธ ์ฟ ํ‚ค
     * @return ์ƒํ’ˆ ์žฌ๊ณ ๋Ÿ‰ ๋ฐฐ์—ด
     * @throws UnsupportedEncodingException ์ธ์ฝ”๋”ฉ ์˜ˆ์™ธ
     */
    public static Integer[] getStockArr(Cookie responseCartCookie) throws UnsupportedEncodingException {
        return Arrays.stream(getCartArr(responseCartCookie))
                .map(CartItemDTO::getProductStock)
                .toArray(Integer[]::new);
    }

    /**
     * ์นดํŠธ ์•ˆ์˜ ์ƒํ’ˆ ์ด ๊ฐ€๊ฒฉ ๋ฐ˜ํ™˜ ๋ฉ”์„œ๋“œ
     *
     * @param responseCartCookie ์‘๋‹ต ์นดํŠธ ์ฟ ํ‚ค
     * @return ์ƒํ’ˆ ์ด ๊ฐ€๊ฒฉ
     * @throws UnsupportedEncodingException ์ธ์ฝ”๋”ฉ ์˜ˆ์™ธ
     */
    public static int getTotalAmount(Cookie responseCartCookie) throws UnsupportedEncodingException {
        return Arrays.stream(getCartArr(responseCartCookie))
                .map(CartItemDTO::getProductPrice)
                .mapToInt(Integer::intValue)
                .sum();
    }

    private static CartItemDTO[] getCartArr(Cookie responseCartCookie) throws UnsupportedEncodingException {
        Map<Integer, CartItemDTO> cartItemDTOMap = getCartItemDTOMap(responseCartCookie);
        Collection<CartItemDTO> values = cartItemDTOMap.values();
        return values.toArray(new CartItemDTO[0]);
    }
}

> ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค์ด์ง€๋งŒ CartItemDTO๋ผ๋Š” ๋ชจ๋ธ์— ์ข…์†์ ์ธ ์ฝ”๋“œ. 

 

@UtilityClass
public class CartCookieUtil {

    private static final String ENC_TYPE = "utf-8";

    /* ์นดํŠธ ์ฟ ํ‚ค ๋ฐ˜ํ™˜ ๋ฉ”์„œ๋“œ */
    public static Optional<Cookie> getCartCookie(Cookie[] requestCookies, String cookieKey) {
        return Arrays.stream(requestCookies)
                .filter(cookie -> cookie.getName().equals(cookieKey))
                .findFirst();
    }

    /* ์นดํŠธ ์ฟ ํ‚ค ๊ฐ’ ๋””์ฝ”๋”ฉ ํ›„ map ๊ฐ์ฒด ๋ฐ˜ํ™˜ ๋ฉ”์„œ๋“œ */
    public static <V> Map<Integer, V> changeCookieToMap(Cookie responseCartCookie, Class<V> valueType) throws UnsupportedEncodingException {
        String cookieValue = responseCartCookie.getValue();
        return JsonUtil.stringToMap(URLDecoder.decode(cookieValue, ENC_TYPE), Integer.class, valueType);
    }

    /**
     *
     * @param responseCartCookie ์‘๋‹ต์šฉ ์žฅ๋ฐ”๊ตฌ๋‹ˆ ์ฟ ํ‚ค
     * @param clazz ๋ณ€ํ™˜ ํƒ€์ž… clazz
     * @param <E> ๋ณ€ํ™˜ ํƒ€์ž…
     * @return ์ฟ ํ‚ค ๊ฐ’ ๋ฆฌ์ŠคํŠธ
     * @throws UnsupportedEncodingException ์ธ์ฝ”๋”ฉ ์˜ˆ์™ธ
     */
    public static <E> List<E> getCookieValueList(Cookie responseCartCookie, Class<E> clazz) throws UnsupportedEncodingException {
        Map<Integer, E> map = changeCookieToMap(responseCartCookie, clazz);
        return new ArrayList<>(map.values());
    }
}

> ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•ด ์ข…์†์„ฑ์„ ์—†์•ด์ง€๋งŒ, ์•„์ง ์ข€ ์† ๋ด์•ผ ๋  ๊ฒƒ ๊ฐ™๋‹ค. ๋ฉ”์„œ๋“œ๋ช…์ด๋‚˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ช… ๋“ฑ๋“ฑ

> ์ถ”ํ›„ ์„œ๋น„์Šค๋‚˜ ์ปดํฌ๋„ŒํŠธ ๋นˆ์„ ์ด์šฉํ•ด ์žฅ๋ฐ”๊ตฌ๋‹ˆ ์ƒ์„ธ ๋กœ์ง์„ ๊ตฌํ˜„ํ•ด ๋ณด๋Š” ๊ฒŒ ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

 

Mapper

๋งคํผ์™€ DDL

> PK ๊ฐ€ ์—†์Œ

> PK๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋”๋ผ๋„ ์ƒ์„ฑ์‹œํ‚ค๋Š” ๊ฒŒ ์ข‹๊ฒ ๋‹ค. 

 

> ์˜๋ฏธ๊ฐ€ ์—†๋Š” ์Šค์นผ๋ผ ๊ฐ’ ๋Œ€์‹  ์ž๋ฐ”์˜ enum์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๊ฒ ๋‹ค. 

> ๋˜ ๋””ํดํŠธ๋ฅผ ํ•˜๊ธฐ๋ณด๋‹ค Not Null๋กœ ์„ค์ •ํ•˜์—ฌ Insert ์‹œ ํ•œ ๋ฒˆ์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒŒ ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค. ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ƒ๊ธธ ์‹œ ์ข‹์ง€ ์•Š๋‹ค.

 

> ๊ธˆ์•ก ๊ด€๋ จ ๋ถ€๋ถ„์€ ์ถฉ๋ถ„ํžˆ ํฐ ์ž๋ฃŒํ˜•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๊ฒ ๋‹ค.

 

> ์ธ๋ฑ์Šค๋ฅผ ์ „ํ˜€ ํƒ€์ง€ ์•Š๋Š” ์ฟผ๋ฆฌ

> % ์—ฐ์‚ฐ์ž๊ฐ€ ๋งจ ์•ž์— ์˜ฌ ๊ฒฝ์šฐ ํ’€์Šค ์บ”์ด ํ•„์—ฐ์ ์ด๋‹ค. ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ํ’€์Šค ์บ”์„ ํ•˜๋ฏ€๋กœ ์กฐ์‹ฌํ•˜์ž.

 

 

Filter

> ์ด๋ ‡๊ฒŒ ์ˆ˜๋งŽ์€ ์ปค์Šคํ…€ ์˜ˆ์™ธ๋ฅผ ๋งŒ๋“ค๊ธฐ๋ณด๋‹ค๋Š” ํ•˜๋‚˜์˜ ์˜ˆ์™ธ๋ฅผ ๋งŒ๋“ค์–ด ๊ฐ๊ธฐ ๋‹ค๋ฅธ ๋ฉ”์‹œ์ง€๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ• ๊ฐ™๋‹ค.

> ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•˜๋Š” ์˜ˆ์™ธ๋Š” Exception์œผ๋กœ ์ฒ˜๋ฆฌํ–ˆ๋‹ค.

> ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ํ•„ํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž.

 

Intercepter

๊ถŒํ•œ ์ฒ˜๋ฆฌ๋ฅผ ์ธํ„ฐ์…‰ํ„ฐ๊ฐ€? 

๊ธฐ์กด์˜ ํ”„๋กœ์ ํŠธ๋Š” ์• ๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•œ ์ธํ„ฐ์…‰ํ„ฐ ๊ธฐ๋ฐ˜ ์ธ๊ฐ€ ์ฒ˜๋ฆฌ.

 

> ์• ๋…ธํ…Œ์ด์…˜์„ ์ •์˜ํ•ด์„œ ์ธํ„ฐ์…‰ํ„ฐ์—์„œ ์• ๋…ธํ…Œ์ด์…˜ ๊ฐ’์„ ์ฝ์–ด ๊ถŒํ•œ ์ฒ˜๋ฆฌ๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค.

> ๋ฌธ์ œ์  : ํŒจํ‚ค์ง€ ๊ฐ„ ์˜์กด์„ฑ์ด ์‹ฌํ•˜๊ฒŒ ์ฆ๊ฐ€ํ•œ๋‹ค. ๊ฐ์ฒด์ง€ํ–ฅ์ ์ด์ง€ ๋ชปํ•˜๋‹ค. 

> URL Paths๋ฅผ ๋”ฐ๋กœ ๊ด€๋ฆฌํ•ด ํ•„ํ„ฐ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

 

=> ํ•  ์ผ

- ERD ๋ชจ๋ธ

- JPA ์„ธํŒ…

- Spring security ์ ์šฉ

- ์ผ๋‹จ ๋ชจ๋†€๋ฆฌํ‹ฑ ํ•˜๊ฒŒ ๋ณธ์—ฐ์˜ ์ฝ”๋“œ์— ์ง‘์ค‘ํ•˜๊ณ  ๋ชจ๋“ˆ ๋ถ„๋ฆฌ๋Š” ์ถ”ํ›„์— ์‹ ๊ฒฝ ์“ฐ์ž.

 

๋ฐ˜์‘ํ˜•