์ฝ๋ ๋ฆฌํฉํ ๋ง [1]
์ง๋ 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 ์ ์ฉ
- ์ผ๋จ ๋ชจ๋๋ฆฌํฑ ํ๊ฒ ๋ณธ์ฐ์ ์ฝ๋์ ์ง์คํ๊ณ ๋ชจ๋ ๋ถ๋ฆฌ๋ ์ถํ์ ์ ๊ฒฝ ์ฐ์.