완성하는데 생각보다 오래걸린 프로젝트였는데, 한번에 Pass가 뜨니 행복하네요.
강의에서 배운 스프링 시큐리티를 사용해 인증 유저만 접근할 수 있도록 API 컨트롤러를 만드는게 프로젝트였습니다.
개인적으로 로그인 기능보다 서비스 레이어, DAO레이어, 컨트롤러 레이어를 어떻게 나누고 서로간의 어떤 형태의 데이터를 가지고 통신(?)을 할지 많이 고민을 했네요.
기존 프로젝트에서는 DTO만 사용했으나, 이번프로젝트에서 VO(Value Object), Entity, DTO(Data Transfer Object)를 전부 만들어서 작업했습니다. 올바른 방법일지는 모르겠으나 생각했을 때 가장 역할 분리가 잘되는 방향으로 코드를 작성했습니다.
#Advice
컨트롤러 명을 명확하게 하자
@GetMapping
public Map<String, Object> list(Principal principal) {
}
@PutMapping
public Map<String, String> update(Principal principal) {
}
컨트롤러에서 일반적인 조회는 list로 하였고, 예약취소에 대한 메소드 이름을 update로 작성하였습니다.
update의 경우 예약 취소인데 너무 모호한 감이 있었는데, 리뷰어분께서 명확한 메소드로 하는게 좋을 거 같다고 해주셨네요.
println 을 삭제하고, 이클립스 디버거를 쓰자
System.out.println(user.toString());
미쳐 지우지 못했네요. 이를 확인하시고 이클립스 디버거를 추천해주셨습니다.
spoqa.github.io/2012/03/05/eclipse-debugger.html
Id는 JSON으로 전달받은 데이터보다는 Principal객체를 사용하여 조회하자
reservationInfoDao.insert(new ReservationInfoEntity(reservationInfoVo.getProductId(),
reservationInfoVo.getDisplayInfoId(), reservationInfoVo.getUserId(),
reservationInfoVo.getReservationYearMonthDay()));
이 부분도 그대로 구현을 할까, 로그인 아이디로 조회를 할까 고민이 많았던 부분이었네요.
admin이라는 ROLE이 있었기 때문에 그냥 단순하게 VO로 객체를 읽어서 조회를 하도록 작성했었는데 아쉽네요.
1. 검증로직을 하나 더 만들어서 권한과 함께 확인을 하거나,
2. UserId를 JSON으로 보내지 않고, 서버에게 맞긴다.
둘중 하나로 구현하면 되지 않을까 생각합니다.
보안상으로는 Principal를 사용해서 검증하는게 맞다고 생각합니다. 문제에 접근 권한 같은것도 세세하게 제시해놓았으면 좋지 않았을까하는 생각이 드네요.
테스트코드에 RunWith, ContextConfiguration 어노테이션을 붙이자
public class ReservationInfoServiceImplTest {
@Autowired
ReservationInfoService reservationInfoService;
@Test
public void addReservationInfoTest() throws Exception {
서비스코드테스트 코드가 안돌아서 리뷰어님께 도움을 요청했는데, 어노테이션을 적지 않았네요. ㅠㅠㅠ 죄송합니다.
추가로 도움될만한 링크를 남겨주셨습니다.
'웹 프레임워크 > Spring' 카테고리의 다른 글
프로젝트E. 예약 : 한줄평 관련 web API 만들기 - 코드 리뷰 및 회고(웹 백엔드) (8) | 2021.02.17 |
---|---|
Spring 현재 날짜를 기준으로 업로드 폴더 생성 및 업로드 (1) | 2021.01.26 |
Spring Controller에서 list형태가 포함되어 있는 json 포맷 받기, 응답 (0) | 2021.01.16 |
Spring Controller에서 json으로 Date format 객체 받기, 응답 (0) | 2021.01.16 |
프로젝트C. 메인, 상세보기 관련 web API 만들기 코드 리뷰 및 회고 (boostcourse 웹 백엔드) (0) | 2021.01.11 |