오늘은 일요일이다!!!
친구들이 나 좀 쉬라고 건강이 걱정된다고 해서 오늘은 쉬었다! 하핳
1. 알고리즘 문제
오늘은 알고리즘 한문제만 풀고 블로그에 정리하였다
2023.03.13 - [알고리즘] - [BOJ][DP] 2156 - 포도주 시식
[BOJ][DP] 2156 - 포도주 시식
DP,, 점화식 생각해내기가 너무 어려운 것 같다,, 1. 문제 입력: 첫째 줄에 포도주 잔의 개수 n이 주어진다. (1 ≤ n ≤ 10,000) 둘째 줄부터 n+1번째 줄까지 포도주 잔에 들어있는 포도주의 양이 순서대
joogongsun.tistory.com
DP 알고리즘 대충 어떤건지는 알 것 같기도 한데 정확하게 공부를 한건 아니라서 나중에 시간 있을 때 한번 다시 개념을 살펴보고 정리 할 필요가 있을 것 같다. 요즘은 알고리즘을 찾아서 정리하고 공부할 시간이 없다..ㅠㅠ
이제 내일은 알고리즘 2문제를 마저 풀고 스프링 심화주차 강의를 들어야 한다.
어제 기술매니저님한테 부탁한 코드리뷰를 오늘 받아서 자기 전에 기술매니저님이 수정해준 부분 확인하고 잘 것 같다! 앗 자바의 정석 제네릭스 부분도 읽어야 한다! 할게 많군,, :') 내일도 화이팅!!!
-끄읕-
할려고 했는데 기술매니저님 코드리뷰에서 깨달음을 얻어서 짧게 더 적어보려 한다!
2. 사용자 로그인 코드 리펙토링
기존 코드:
//controller 부분
@PostMapping("/login")
public ResponseEntity login(@RequestBody LoginRequestDto loginRequestDto, HttpServletResponse response) {
User user = userService.login(loginRequestDto);
response.addHeader(JwtUtil.AUTHORIZATION_HEADER, jwtUtil.createToken(user.getId(), user.getRole()));
return new ResponseEntity("로그인 성공" , HttpStatus.OK);
}
//service 부분
@Transactional(readOnly = true)
public User login(LoginRequestDto loginRequestDto) {
// 사용자 확인
User user = userRepository.findByUsername(loginRequestDto.getUsername()).orElseThrow(
() -> new CustomException(ErrorCode.USER_NOT_FOUND)
);
// 비밀번호 확인
if(!user.getPassword().equals(loginRequestDto.getPassword())){
throw new CustomException(ErrorCode.NOT_PROPER_PASSWORD);
}
return user;
}
controller 부분에서 로그인할 때 입력한 정보들을 loginRequestDto에 받아와서 userservice에 user 정보 조회 역할을 맡긴다.
userservice에서 로그인 가능한지 체크하고 가능하면 user 객체를 리턴 해준다.
다시 controller 부분에서 리턴 받은 user의 아이디와 권한을 getter 함수로 가져와서 토큰을 만들고 응답의 헤더에 넣어준다.
나름 토큰 생성하고 응답에 넣어주는 부분을 controller로 빼서 분리를 잘 했다고 생각했는데 매니저님이 수정해주신 코드를 보고 아차! 싶었다
수정 후 코드:
//controller 부분
@PostMapping("/login")
public ResponseEntity login(@RequestBody LoginRequestDto loginRequestDto, HttpServletResponse response) {
Map<String , String> result = userService.login(loginRequestDto);
response.addHeader(JwtUtil.AUTHORIZATION_HEADER, jwtUtil.createToken(result.get("id") , result.get("role")));
return new ResponseEntity("로그인 성공" , HttpStatus.OK);
}
//service 부분
@Transactional(readOnly = true)
public Map login(LoginRequestDto loginRequestDto) {
// 사용자 확인
User user = userRepository.findByUsername(loginRequestDto.getUsername()).orElseThrow(
() -> new CustomException(ErrorCode.USER_NOT_FOUND)
);
// 비밀번호 확인
if(!user.getPassword().equals(loginRequestDto.getPassword())){
throw new CustomException(ErrorCode.NOT_PROPER_PASSWORD);
}
Map<String , String> result = new HashMap<>();
result.put("id" , String.valueOf(user.getId()));
result.put("role" , String.valueOf(user.getRole()));
return result;
}
보면 매니저님이 수정해주신 코드에는 서비스 쪽에서 user를 리턴하는 것이 아니라 user의 아이디와 권한을 getter함수로 가져와서 map에 각각 키가 id, role이 되게 String 타입으로 넣어주고 맵을 리턴한다.
그리고 controller에서 리턴받은 맵에서 키로 사용자 아이디랑 권한을 찾아서 똑같이 토큰을 생성하고 응답 헤더에 넣어준다.
즉, 내 기존 코드에서는 controller 부분에서 user 객체의 데이터를 조회했기 때문에 이것은 MVC 패턴에 어긋난다! 데이터를 조회하는 것은 service가 해야 할 일이다!! controller에서 entity를 사용하는 일이 없게 하자!!
이제 진짜
-끄읕-