본문 바로가기

웹 프레임워크/Spring

프로젝트 D. Spring Security를 이용한 로그인하기 및 예약 관련 web API 만들기 - 코드 리뷰 및 회고(웹 백엔드)

728x90

www.boostcourse.org/web326

 

웹 백엔드

부스트코스 무료 강의

www.boostcourse.org

 

 

 



완성하는데 생각보다 오래걸린 프로젝트였는데, 한번에 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 {

서비스코드테스트 코드가 안돌아서 리뷰어님께 도움을 요청했는데,  어노테이션을 적지 않았네요. ㅠㅠㅠ 죄송합니다. 

 

추가로 도움될만한 링크를 남겨주셨습니다.

 

 

Mockito 이용해서 Test를 해보자 - 머루의개발블로그

필자는 예전에는 SI 시절에는 테스트 케이스를 전혀 작성하지 못했다. 물론 핑계일 수도 있지만 테스트까지 만들 시간적 여유가 없었던건지 아니면 주변 환경 때문인지는 모르겠지만 아무튼 테

wonwoo.ml

 

 

Junit @RunWith @ContextConfiguration에 대해서

@RunWith() 스프링의 테스트 컨텍스트 프레임워크 JUnit 확장 기능 지정 Junit은 각각의 테스트가 서로 영향을 주지 않고 독립적으로 실행됨을 원칙으로 하기에 @Test 마다 오브젝트를 생성한다. 이와

lng1982.tistory.com

 

 

 

 

 

 

728x90