📕 프로젝트 시작을 앞두고


현재 프론트엔드 개발자분들과 같이 프로젝트가 시작되었다. 일단 프로젝트를 하기에 앞서 많은 걱정이 있다. 스스로 너무 부족하다고 생각이 되기떄문이다.

AWS

첫번쨰로는 배포에 너무 안일하게 방치를 해두고 있었다는 것이다. 가장 중요한 배포 공부를 시작한지 1주일이 채 안된다는 것이다. 현재 멘토님께서 강의를 해주시지만 역시 빠르게 알려주는 것보다는 직접 해보는것이 좋기때문에 혼자서 책을 보고 공부하고 있지만 역시 이해를 하면서 가는데에는 시간이 걸린다.

현재 기본 EC2 방법부터 스크립트를 이용한 배포 그리고 엘라스틱빈스톡을 이용한 배포를 진행하고 있다.

아직 CI/CD배포까지 너무나 많이 남았기 떄문에 잠을 줄이고 커피를 많이 마셔서라도 같이 하는 사람들에게는 피해는 주지 않도록 해야겠다. 앞으로 들어야하는 강의는 대략 3시간에서 4시간 정도면 아마 끝날것 같다.

마음이 많이 조급하지만, 절대로 서두르지는 말자.

JWT 인증과 인가

가장 나에게 발목을 잡았던 부분이다

정말 이해하기 힘들었다. 이유는 한 인증과 인가의 영어단어가 매우 비슷하고, 설명을 들을때는 막 받아드릴려고 했기 떄문에, 개념이 섞이게 되었다. 그래서 직접 유투브를 보면서 정리를 해보았다.

(인증)Authentication 순서
1. username, password를 받는다.
2. 파싱을 해서 LoginRequestDto로 바꾼다.
3. 1번을 가지고 있는 인증토큰을 생성한다.
4. DB에 같은 것을 가지고있는지 확인한다.(loadByUsername 메소드)
5. 없으면 unSuccessful 메소드가 실행
6. 있으면 LoginUser 객체를 생성한다.
7. 그리고 SecurityContextHolder안의 Authentication 내부에 세션에 LoginUser가 담기게 된다.
8. Jwt토큰이 생성되고, Response 헤더에 담아서 보내준다.

(인가)Authorization 순서
1. 다시 들어오게 되면 원래는 인증을 하지만 uri를 보고 인증 과정을 하지않고 인가만 체크를 한다.
2. 들어온 데이터중에서 id, role만 따로 뽑아서 세션에 다시 넣어서 확인을 한다. 세션에 넣어서 확인을한다.

즉, 인증이 최우선으로 먼저 작동해야 인가가 가능한 것을 알 수 있다. 인가는 권한(role)을 체크하는 것이다.

이 부분을 이렇게 정리하고 나니까 2개의 구분이 확실하게 되었다.

하지만 알아도 자만하지 말고, 계속해서 봐야할 것 같다. 지금은 시간이 너무 빠듯해서, 정리는 생각조차 못하겠지만, 다음번에 볼떄는 정리를 하면서 나만의 노트로 만들수 있을 것 같다.

Junit Security, Jwt를 통한 테스트 코드

현재 내가 연습중인 부분이고 이해를 할려고 노력하는 부분이다.

은행 계좌를 가지고 테스트코드를 연습하는 것인데, Jwt와 Security의 모든 과정 하나하나를 테스트를 한다.

다음은 계좌를 등록하는 Service부분 테스트의 예시이다. 보면 Service 부분의 테스트는 다른 Controller 테스트와는 다르다.

왜냐하면 테스트코를 작성할 떄는 단위별로 테스트를 해야하기 때문에 Service단만 Mock에 띄우고 테스트를 해야하기 떄문이다.

그래서 @InjectMocks @Mock @Spy @ExtendWith(MockitoExtension.class) 과 같은 가짜 환경에 DI를 해주거나, 또는 진짜를 가짜환경에 넣어주는 과정이 필요하다.

이러한 과정을 연습중에 있다. 아직 테스트 코드를 짜는 것은 너무나 익숙하지 않다. 당연히 강의2번듣고 1번 따라친 것으로 많은 것을 바라면 되지 않을 것 같다.

@ExtendWith(MockitoExtension.class)
public class AccountServiceTest extends DummyObject {

     // 가짜 UserRepository가 AccountService의 주인이 된다.
     @InjectMocks // 모든 Mock들이 InjectMocks 로 주입됨
     private AccountService accountService;
     @Mock
     private UserRepository userRepository;
     @Mock
     private AccountRepository accountRepository;

     @Spy // 진짜 객체를 InjectMocks에 주입한다.
     private ObjectMapper om;

     @Test
     public void 계좌등록_test() throws Exception {
          // given
          Long userId = 1L;

          AccountSaveReqeustDto accountSaveReqeustDto = new AccountSaveReqeustDto();
          accountSaveReqeustDto.setNumber(1111L);
          accountSaveReqeustDto.setPassword(1234L);

          // stub 1
          User ssar = newMockUser(userId, "ssar", "쌀");
          when(userRepository.findById(any())).thenReturn(Optional.of(ssar));

          // stub 2
          when(accountRepository.findByNumber(any())).thenReturn(Optional.empty());

          // stub 3
          Account ssarAccount = newMockAccount(1L, 1111L, 1000L, ssar);
          when(accountRepository.save(any())).thenReturn(ssarAccount);

          // when
          AccountSaveResponseDto accountSaveResponseDto = accountService.계좌등록(accountSaveReqeustDto, userId);
          String responseBody = om.writeValueAsString(accountSaveResponseDto);
          System.out.println("테스트 : " + responseBody);

          // then
          assertThat(accountSaveReqeustDto.getNumber()).isEqualTo(1111L);
     }
}

📕 프로젝트를 앞두고 기분과 심정

저엉말 조급하다고 해도 과언이 아니다. 왜냐하면 현재 나의 백엔드 조원 분들은 승민님, 아영님, 진호님 그리고 나 이렇게 4명으로 구성되어 있고 승민님 께서 리드이다.

다들 너무나 정말 잘하신다. 다들 이쪽이 아니여도 프로그래밍에 기본적으로 경험이 있는 분들이셔서 어떻게 프로젝트를 진행해야하는지 일의 순서를 알고 있다.

프로젝트를 통해서 반드시 알고 싶은 것

개인적으로 무엇인가를 할떄는 나는 큰틀을 이해하고 일의 과정, 즉 매커니즘을 이해하고 싶다.

현재 승민님이 학부생이셔서 프로젝트의 순서를 알고 있어서, 정말 많이 배울수 있겠다고 생각했다.

프로젝트의 순서

1) ERD 설계(완)
2) api 기능 선택

지금은 여기까지하고, 프론트분들께서 화면을 주면 그때부터 우리가 api를 설계할 것 같다.

📕 총평

정말 너무 알아야 할게 많다............
.

profile
블로그 이전 : https://medium.com/@jaegeunsong97

0개의 댓글