์ฃผ๋ง๋ค ๋ฆฌํฉํฐ๋ง ๋ฐ ๊ธฐ๋ฅ ์ถ๊ฐํ๋ ๋ธ๋์น๋ฅผ ๋ฐ ์ค๊ณํ๋ฉฐ ํ๋ก์ ํธ๋ฅผ ์งํ ์ค์ด๋ค.
์ด๋ฐ ์์ผ๋ก ์ฃผ๋ง๋ค ๋ฆฌํฉํฐ๋ง์ ํ๋๊น ํ์คํ ์ฝ๋๊ฐ ๊น๋ํด์ง๋ ๊ฑธ ๋๋๋ค.
์ค๋ ์์นจ๋ถํฐ ์งํํ ์ฝ๋ ๋ฆฌํฉํ ๋ง์ ์ ์ง๋ณด์์ฑ์ ๋ฐ์ง๋ ๊ฒ์ ๋ฌผ๋ก ์ด๊ฑฐ๋์ ์ด๋ ค์ด ๋ฏํ๋ฉด์๋ ์๋ก์ด ๊ฐ๋ ์ ๋์ ํด์ ์งํํ๋ ๋๋ฆ ๋ณด๋์ฐผ๋ ๋ฆฌํฉํฐ๋ง์ด์๋ค.
์ง๋ฉดํ๋ ๋ฌธ์ ๋ค์ ๋์ดํ๋ฉฐ ์ ๋ฆฌ๋ฅผ ํ๋ฒ ํด๋ณด๊ฒ ๋ค.
์ธ์ฆ & ์ธ๊ฐ ์ฑ ์ ๋ถ๋ฆฌ
๋๋ ์ธ์ฆ, ์ธ๊ฐ๋ฅผ ์ธํฐ์ ํฐ๋ก ๊ตฌํํ๋ค.
์ธ์ฆ์ ํ ํฐ ๊ฒ์ฆ,
์ธ๊ฐ๋ ์๋ํ ์ด์ ๋ฐ ํ ํฐ ๊ฒ์ฆ์ผ๋ก ๊ตฌํํ๋ค.
๊ธฐ์กด ์ฝ๋ : ์ธํฐ์ ํฐ์ preHandle ๋ฉ์๋ ์์ ๋ ๊ฐ์ ๋ก์ง์ด ๋์์ ๋ค์ด์๋ค.
ํ ํฐ ๊ฒ์ฆ + ์๋ํ ์ด์ ๊ฒ์ฆ
=> ์ฑ ์์ด ๋ง๋ค -> ์ ์ง๋ณด์๊ฐ ์ด๋ ต๋ค.
ํด๊ฒฐ : ์ธํฐ์ ํฐ๋ฅผ ๋๋์ด ๋ถ๋ฆฌํ๋ค.
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
log.info("์ธ์ฆ ์ฒ๋ฆฌ ์ธํฐ์
ํฐ ์คํ");
/* ํ ํฐ ์ถ์ถ ๋ฐ ๊ฒ์ฆ */
String requestToken = authorizationExtractor.extract(request, BEARER_TOKEN);
jwtTokenProvider.validateToken(requestToken);
/* ํ ํฐ body์ ์กด์ฌํ๋ ์์ด๋์ ๋ฑ๊ธ */
final String tokenUserId = jwtTokenProvider.getUserId(requestToken);
/* request์ ํ ํฐ ์ ์ ๊ถํ ์ถ๊ฐ */
request.setAttribute("tokenUserRole", jwtTokenProvider.getUserGrade(requestToken));
/* Redis DB์ ์ ์ฅ๋ ํ ํฐ ์ถ์ถ */
final ValueOperations<String, Object> valueOperations = redisTemplate.opsForValue();
final String redisToken = (String) valueOperations.get(tokenUserId);
/* DB์ ํ ํฐ์ด ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐ */
if (redisToken == null) {
throw new RedisNullTokenException(AuthMessages.NULL_TOKEN.getMessage());
}
/* DB ํ ํฐ๊ณผ ๋ก๊ทธ์ธ ์ ์ ํ ํฐ ์ ๋ณด๊ฐ ์ผ์นํ์ง ์์ ๊ฒฝ์ฐ */
if (!redisToken.equals(requestToken)) {
throw new TokenMismatchException(AuthMessages.INVALID_TOKEN.getMessage());
}
return true;
}
=> ์ธ์ฆ ์ฒ๋ฆฌ ์ธํฐ์ ํฐ
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
log.info("๊ถํ ์ฒ๋ฆฌ ์ธํฐ์
ํฐ ์คํ");
if (!(handler instanceof HandlerMethod)) {
return true;
}
/* ํธ๋ค๋ฌ๋ฉ์๋ ์๋ํ
์ด์
๊ฐ ์ถ์ถ */
HandlerMethod handlerMethod = (HandlerMethod) handler;
Auth auth = handlerMethod.getMethodAnnotation(Auth.class);
/* ๊ถํ์ด ํ์ ์๋ ์ ๊ทผ */
if (auth == null) {
return true;
}
/* ์๋ํ
์ด์
๊ฐ => ๊ด๋ฆฌ์์ผ ๊ฒฝ์ฐ */
if (auth.role() == ADMIN) {
/* ๋ก๊ทธ์ธ ์ ์ ๊ถํ์ด ๊ด๋ฆฌ์๊ฐ ์๋ ๊ฒฝ์ฐ */
if (!request.getAttribute("tokenUserRole").toString().equals(ADMIN.toString())) {
throw new AuthenticationException(AuthMessages.NOT_ADMIN_AUTH.getMessage());
}
}
return true;
}
=> ๊ถํ ์ฒ๋ฆฌ ์ธํฐ์ ํฐ
=> ์ธ์ฆ์ด ์ด๋ฃจ์ด์ง๊ณ ์ธ๊ฐ๊ฐ ์ด๋ฃจ์ด์ง๋ค.
์ค๋ณต๋ ์ฝ๋ & ๋น์ฆ๋์ค ๋ก์ง
์ฅ๋ฐ๊ตฌ๋ ๊ด๋ จ ์ปจํธ๋กค๋ฌ์์ ์ค๋ณต๋ ์ฝ๋๊ฐ ๋ง์ด ๋ฐ์ํ๋ค.
์์ฑ์ ๋จผ์ ํ๊ณ ๋์ ๋ฆฌํฉํฐ๋ง์ด ํ์์ ์ผ๋ก ํ์ํ๋ค๋ ์๊ฐ์ด ๋ค์๋ค.
๋, Service ๊ณ์ธต์ ๊ดํด ๊ถ๊ธ์ฆ์ด ์์๋ค.
๊ธฐ์กด์ ๋๋ Service ๊ณ์ธต์ DB ๋ก์ง์ ๊ฐ์ ธ์ค๊ณ ๋๊ฒจ์ฃผ๋ ์ญํ ์ ํ๋ค๊ณ ์๊ณ ์์๋ค.
๊ทธ๋์ CartController๋ ์ฟ ํค๋ก ์ด๋ฃจ์ด์ง๋ฏ๋ก Service๋ฅผ ์ด์ฉํ์ง ์์๋ค.
ํ์ง๋ง Service๋ ์ ๋ฐ์ ์ธ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๋ ๊ณ์ธต์ผ๋ก ์ปจํธ๋กค๋ฌ์์ ์๋น์ค๋ก ๋ก์ง์ ์ด๊ดํด๋ ๋์์๋ค.
๊ทธ๋ฌ๋ ์ด๋ฒ ๊ฒฝ์ฐ์๋ ๋ก์ง ์ฒ๋ฆฌ ๋ณด๋ค๋ ์ค์ฒฉ๋ ์ฝ๋๊ฐ ์ฃผ๋ ๋ฌธ์ ์์์๊ธฐ์, ์ปจํธ๋กค๋ฌ์์ ๋ฉ์๋๋ฅผ ๋ถ๋ฆฌํ์ฌ ํด๊ฒฐํ๋ค.
/**
* ์ฅ๋ฐ๊ตฌ๋ ์ฟ ํค๋ฅผ ๋ฐํ
*
* @param request servlet request ๊ฐ์ฒด
*/
private void getCartCookie(HttpServletRequest request) {
responseCartCookie = CookieUtil.getCartCookie(request.getCookies()).orElse(null);
}
/**
* ์ฅ๋ฐ๊ตฌ๋ ์ฟ ํค ๊ฐ์์ map ๊ฐ์ฒด ์ถ์ถ
*
* @param responseCookie ์ฅ๋ฐ๊ตฌ๋ ์ฟ ํค
* @throws UnsupportedEncodingException ์ธ์ฝ๋ฉ ๋ฌธ์ ์ ์์ธ ๋ฐ์
*/
private void getCartDTOMap(Cookie responseCookie) throws UnsupportedEncodingException {
cartDTOMap = CookieUtil.getCartItemDTOMap(responseCookie);
}
/**
* ์ฅ๋ฐ๊ตฌ๋ map ๊ฐ์ฒด์์ ์ํ ์ญ์
*
* @param productNo ์ฅ๋ฐ๊ตฌ๋์ ์ถ๊ฐ, ์์ , ์ญ์ ํ ์ํ ๋ฒํธ
*/
private void removeProductFromMap(int productNo) {
cartDTOMap.remove(productNo);
}
/**
* ์ ๋ฌํ ์ฅ๋ฐ๊ตฌ๋ ์ฟ ํค๋ฅผ ์ธํ
*
* @param response servlet response ๊ฐ์ฒด
* @throws UnsupportedEncodingException ์ธ์ฝ๋ฉ ๋ฌธ์ ์ ์์ธ ๋ฐ์
*/
private void setCartCookie(HttpServletResponse response) throws UnsupportedEncodingException {
responseCartCookie.setValue(URLEncoder.encode(JsonUtil.objectToString(cartDTOMap), ENC_TYPE));
response.addCookie(responseCartCookie);
}
=> ์ปจํธ๋กค๋ฌ์์ ๋ฐ๋ก ๋ถ๋ฆฌํ ๋ฉ์๋
=> ์ฅ๋ฐ๊ตฌ๋ ์ญ์ ํธ๋ค๋ฌ์ด๋ค. ํ๋์ ๋ด๋ ๋ฉ์๋์ ์ด๋ฆ์ผ๋ก ์ ์ถ๊ฐ ๊ฐ๋ฅํ๋ค.
For๋ฌธ? Stream?
๋ฐฐ์ด์ด๋ ์ปฌ๋ ์ ์ ๊ฐ์ ธ์ ๋ฐ๋ณต์ ํตํด ๋ฐ์ดํฐ๋ฅผ ๊บผ๋ด์ ๋ณ๊ฒฝ ๋ฐ ์ถ์ถ?
์ด์ ์ด๋ ๊ฒ ํ ํ์๊ฐ ์๋ค.
์ฝ๋์ ๊ฐ๋ ์ฑ๋ ๋จ์ด์ง๊ณ , ์ ์ง๋ณด์๋ ์ฝ์ง ์๋ค.
=> ์์๊ฐ ๋์ด๋๋ฉด? Switch ํ๋ ๋ ์ถ๊ฐํ ๊ฑฐ์ผ? ์ค์ด๋ค๋ฉด ์ ๊ฑฐํ ๊ฑฐ์ผ?
public static Optional<UserGrade> of(int gradeNumber) {
return Optional.of(Arrays.stream(UserGrade.values())
.filter(userGrade1 -> userGrade1.getValue() == gradeNumber)
.findFirst()
.orElse(BASIC_USER));
}
=> ์คํธ๋ฆผ์ ์ฌ์ฉํ์ ๊ฐ๋ ์ฑ์ด ๋งค์ฐ ์ข์์ง๊ณ , ๋ณ๊ฒฝ ์ฑ๋ ํ์ ํ ์ค์ด๋ ๋ค.
=> ๋ฑ ๋ด๋ ํ์ ์๋ for๋ฌธ์ด ๋์๊ฐ์ง?
@Transactional(readOnly = true)
public List<ProductListDTO> getCategoryList(Map<String, Object> map) {
return productMapper.selectCategoryList(map).stream()
.map(productVO -> modelMapper.map(productVO, ProductListDTO.class))
.collect(Collectors.toList());
}
=> ํจ์ฌ ๊ฐ๊ฒฐํด์ก๋ค.
๊ฒฐ๋ก
์ด์ ์ฃผ๋ฌธ์ด ๋จ์๋ค. ์ฃผ๋ฌธ๋ restFul ํ๊ฒ ๋น ๋ฅด๊ฒ ์์ฑํด๋ณด๊ณ ๋ถ์ง๋ฐํ ํด๋ด์ผ๊ฒ ๋ค.
๋ฆฌํฉํฐ๋ง ํ๋ฉด์ ์ฝ๋๊ฐ ๊นจ๋ํด์ง๋ ๊ฑธ ๋ณด๋ ํ ๋ ์ ๋ง ๋จธ๋ฆฌ์ ์ฅ ๋์ง๋ง ๋๋๊ณ ๋๋ฉด ์ง์ง ๋ฟ๋ฏํ๋ค.
๋ ๋ ธ๋ ฅํด์ ๋ฐ์ ํด๋ณด์~
'๐ Spring Framework > Spring Project' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
2022.05.26 ใํธ๋ํฝ์ด ๋ชฐ๋ ธ์ ๊ฒฝ์ฐใ (0) | 2022.05.26 |
---|---|
2022.05.25 ใEmail ์ธ์ฆใ (0) | 2022.05.25 |
2022.05.22 ใShopping Cart API [Ver.2]ใ (0) | 2022.05.22 |
2022.05.21 ใ Shopping Cart API ๋ง๋ค๊ธฐ ใ (0) | 2022.05.21 |
2022.05.20 ใ์คํ๋ง ๋ถํธ ๊ถํ ์ฒ๋ฆฌใ (0) | 2022.05.20 |