Blog

2023.9.18 멘토링 피드백

멘토링 날짜
2023/09/18
작성자
진행상황
Done
Q. 계층별 예외처리 방법에 대해서 정확히 알고싶습니다. 아래 Controller와 Service에서 각 계층에 구현한 예외 처리 코드는 적절한것인지 궁금합니다.
UserController.java 의 회원가입 API
@RestController @RequiredArgsConstructor @RequestMapping("/api") public class UserController { private final UserService userService; // 회원가입 API - RestApiException 클래스로 반환 내용 통일시키기 적용 @PostMapping("/user/signup") public ResponseEntity<RestApiException> signup(@RequestBody SignupRequestDto requestDto) { try { String username = requestDto.getUsername(); String password = requestDto.getPassword(); if (!userService.isValidUsername(username)) { // <- UserService의 유효성검사 중복제거용 메소드를 호출 return ResponseEntity.status(HttpStatus.BAD_REQUEST) .body(new RestApiException("ID 형태가 부적절합니다.", HttpStatus.BAD_REQUEST.value())); } if (!userService.isValidPassword(password)) { // <- UserService의 유효성검사 중복제거용 메소드를 호출 return ResponseEntity.status(HttpStatus.BAD_REQUEST) .body(new RestApiException("PW 형태가 부적절합니다.", HttpStatus.BAD_REQUEST.value())); } userService.signup(requestDto); return ResponseEntity.ok(new RestApiException("회원가입 성공", HttpStatus.OK.value())); } catch (Exception e) { e.printStackTrace(); return ResponseEntity.status(HttpStatus.BAD_REQUEST) .body(new RestApiException("회원가입 실패", HttpStatus.BAD_REQUEST.value())); } }
Java
복사
UserService.java 의 회원가입 구현부
@Service @RequiredArgsConstructor public class UserService { private final UserRepository userRepository; // Bean DI private final PasswordEncoder passwordEncoder; // Bean DI private final JwtUtil jwtUtil; // Bean DI // 회원가입 기능 public void signup(SignupRequestDto requestDto) { String userId = requestDto.getUserId(); String password = requestDto.getPassword(); Boolean isAdmin = requestDto.isAdmin(); String adminToken = requestDto.getAdminToken(); // 회원 중복 확인 if (userRepository.findByUsername(userId).isPresent()) { throw new IllegalArgumentException("중복된 사용자가 존재합니다."); } // 아이디(회원이름) 유효성검사 if (!isValidUsername(userId)) { throw new IllegalArgumentException("ID 형태가 부적절합니다."); } // 비밀번호 기초 유효성검사, 암호화 if (!isValidPassword(password)) { throw new IllegalArgumentException("PW 형태가 부적절합니다."); } // 비밀번호 암호화 password = passwordEncoder.encode(password); // 회원유형(Role) 설정 UserRoleEnum role = UserRoleEnum.USER; // default = USER if(isAdmin == true){ if(!ADMIN_TOKEN.equals(adminToken)){ throw new IllegalArgumentException("관리자 코드가 잘못 입력되어 등록이 불가능 합니다."); } role = UserRoleEnum.ADMIN; } // 사용자 등록 String username = requestDto.getUsername(); User user = new User(userId ,username, password, role); userRepository.save(user); }
Java
복사
A. 위 예외처리는 단순히 중복되고 있는 상황이다. AOP를 활용해서 컨트롤러에서 구현하자, 어떤 예외처리인지에 따라서 계층의 위치가 정해지는 것이다. 통일을 하면된다. 현재 저것은 클라이언트 오류를 잡는것이니 컨트롤러에 구현해도되고 →ROLE을 쓴다면 PREAUTHORIZE라는 것이 있다. 사업자인지 아닌지 검증하는것도 AOP를 도입하자.
Q. - 로그인 부분(login , logout) 디벨롭 - 로그아웃을 레디스를 활용해서 처리하고자 하는데, jwt필터를 활용해서 config딴에서 처리하는 것과 큰 차이가 있는지? → 어떤 것을 활용해야 하는지? → 토큰관리를 레디스 쓰는것에 대한 장점을 미리 공부하고 해
A. 레디스는 인메모리 DB→ 조회가 빠른 장점 캐시화 일시적 저장에 대한 장점 조회가 빈번한 것들에 대한 장점이 있다. 우선 레디스 부분은 우선 공부를 진행 하고 실습을 하는 것이 순서가 맞다. 리프레시 토큰, 조회 삭제가 빈번하다는 특징이 있으니 리프레시 토큰 부분을 먼저 공부하고 그 장점 단점을 보고 그 이후에 레디스를 적용시키는 것이 어떤 의미가 있을지 공부가 될것이다.
Q. - 주문과 메뉴관계
A. 중간 테이블인 주문상세 테이블을 만들어 보자 주문과 메뉴 사이에 수량, 가격 등을 관리해줄 미들테이블 생성.
Q. - 키워드에대한 검색 키워드를 입력하면 가게에 속한 메뉴들이 나오는게 맞는지 그리고 어떻게 구현해야 할지
A. 자연어 처리 부분이 어려울 것이다. Like절로 조회될 대상을 조절해야 하는데 시간적으로 어려울 것 같다. 엘라스틱서치는 좀 어려울지도. 검색에대한 정책, 방향이 다른것을 통일하고 상점명 으로 하면 단순하게 처리 or 메뉴명을 검색할지 잘 정해보자.
Q. - 코드 리뷰
A. 전체적으로 반환 타입, 주석 정리, 코드 스타일 통일이 필요하다