본문 바로가기

항해99

23.09.13 항해 99 16기 주특기 Spring 18일차

오늘 공부한 것

* Lv4 과제 제출

* Spring 심화주차 강의 듣기

* Lv3 과제 페어 리뷰

 

어제에 이어서 Lv4 과제를 계속 진행했다

 

☝ 새로운 요구사항을 구현해 보세요!

  1. Lv.3 프로젝트에 Spring Security 적용하기

✌️ 요구사항에 맞게 수정해 보세요!

 

  1. 회원 가입 API
    • username, password를 Client에서 전달받기
    • username은 최소 4자 이상, 10자 이하이며 알파벳 소문자(a~z), 숫자(0~9)로 구성되어야 한다.
    • password는 최소 8자 이상, 15자 이하이며 알파벳 대소문자(a~z, A~Z), 숫자(0~9)로 구성되어야 한다.
    • DB에 중복된 username이 없다면 회원을 저장하고 Client 로 성공했다는 메시지, 상태코드 반환하기
    • 회원 권한 부여하기 (ADMIN, USER) - ADMIN 회원은 모든 게시글 수정 / 삭제 가능
    • 참고자료
  2. 로그인 API
    • username, password를 Client에서 전달받기
    • DB에서 username을 사용하여 저장된 회원의 유무를 확인하고 있다면 password 비교하기
    • 로그인 성공 시, 로그인에 성공한 유저의 정보와 JWT를 활용하여 토큰을 발급하고, 발급한 토큰을 Header에 추가하고 성공했다는 메시지, 상태코드 와 함께 Client에 반환하기
  3. 전체 게시글 목록 조회 API
    • 제목, 작성자명(username), 작성 내용, 작성 날짜를 조회하기
    • 작성 날짜 기준 내림차순으로 정렬하기
  4. 게시글 작성 API
    • 토큰을 검사하여, 유효한 토큰일 경우에만 게시글 작성 가능 ⇒ Spring Security를 사용하여 토큰 검사 및 인증하기!
    • 제목, 작성자명(username), 작성 내용을 저장하고
    • 저장된 게시글을 Client 로 반환하기
  5. 선택한 게시글 조회 API
    • 선택한 게시글의 제목, 작성자명(username), 작성 날짜, 작성 내용을 조회하기 (검색 기능이 아닙니다. 간단한 게시글 조회만 구현해주세요.)
  6. 선택한 게시글 수정 API
    • 토큰을 검사한 후, 유효한 토큰이면서 해당 사용자가 작성한 게시글만 수정 가능 ⇒ Spring Security를 사용하여 토큰 검사 및 인증하기!
    • 제목, 작성 내용을 수정하고 수정된 게시글을 Client 로 반환하기
  7. 선택한 게시글 삭제 API
    • 토큰을 검사한 후, 유효한 토큰이면서 해당 사용자가 작성한 게시글만 삭제 가능 ⇒ Spring Security를 사용하여 토큰 검사 및 인증하기!
    • 선택한 게시글을 삭제하고 Client 로 성공했다는 메시지, 상태코드 반환하기

 

기존에 구현했던 것에서 Spring Security를 적용하는 것이었는데

이전 강의 내용을 참고하면서 하니 그렇게 어렵지 않았다

 

1. API 명세

기능 URL Method Requst Header Request Response Response Header
회원가입 /api/auth/signup post   username,
password
"msg" :" 회원가입 성공"
"statusCode":200
 
로그인 /api/auth/login post   username,
password
"msg" :" 로그인 성공"
"statusCode":200
토큰
게시글 작성 /api/post post 토큰 title, contents id, title, username,
contents, createAt,
modifiedAt
 
게시글 조회 /api/post post     id, title, username,
contents, createAt,
modifiedAt
 
선택한
게시글 조회
/api/post/{id} get     id, title, username,
contents, createAt,
modifiedAt
 
선택한
게시글 수정
/api/post/{id} put 토큰 title, contents id, title, username,
contents, createAt,
modifiedAt
 
선택한
게시글 삭제
/api/post/{id} delet 토큰   "msg" :" 삭제 성공"
"statusCode":200
 

 

이후에는 심화주차 강의를 들었다

 

통합테스트 두 개 이상의 모듈이 연결된 상태를 테스트 할수 있고 모듈 간의 연결에서 발생하는 에러 검증이 가능

                   @SpringBootTest 스프링이 동작되도록 해주는 애너테이션 IOC / DI 기능을 사용하고 Repository를 사용해

                   DB CRUD가 가능

 

부가기능 모듈화 AOP를 통해 만듬 핵심기능과 분리해서 부가기능 중심으로 설계 및 구현

                           1) 핵심기능 각 API 별 수행해야 할 비즈니스 로직, 검색, 등록, 회원가입 등

                           2) 부가기능 핵심기능을 보조하는 기능, 로그기록, API 수행시간 저장등

 

심화주차 강의를 듣는 중 Lv3 페어리뷰팀이 정해져서 페어리뷰를 했다

1. 우리 페어가 남긴 ISSUES

 1) Entity 및 객체 생성 클래스

   (1) @Setter의 경우 private로 설정한 field를 public 처럼 사용하게 되는데 특히 모두가 필요한 상황이 아니기에 IntelliJ의

         control+N 단축키를 사용하여 특정 필드만 setMethod를 구현하는게 좋다

 2) 게시글을 생성날짜부터 정렬하는 것은 @OderBy 애너테이션을 이용하여 @OderBy("createAt desc")하여 내림차순

     정렬 했습니다

 3) 특수문자의 경우 SQL Injection과 같이 다양한 이유로 사용하는 것이 제한적입니다

      https://www.researchgate.net/figure/Special-characters-used-to-compose-SQL-injection-code_tbl1_342887199

 

2. 우리 페어가 받은 ISSUES

 1) Post Entity에 Setter 를 쓰지 않고 필요한 곳에 set 메서드를 활용한 것이 효율적이다.

 2) OrderBy("createdAt" = desc)로 생성날짜를 내림 차 순으로 정렬한 것이 굉장히 효율적인 솔수션이었다.

 3) 우리와는 다르게 StringResponseDto를 생성하여, PostResponseDto, PostDeleteResponseDto로 분리하지 않고

     직관적으로 DTO의 이름을 정의한 것이 인상적이었다.

 4) public ResponseEntity<BoardResponseDto> boardCreate(@RequestBody BoardRequestDto requestDto,

      HttpServletRequest req){ }
      이렇게 길다보면 파라미터 마다 엔터해서 가독성을 올릴수 있어요.

 5)  @RestControllerAdvice//전역 예외 처리(클래스 위)
       ......
     @ExceptionHandler(Exception.class)
     public ResponseEntity<?> handleNotFoundEntity(Exception e){}

     전역 예외 처리 구현 부분이에요.

     테이블 연관 관계 와 JPA 활용 잘하셨어요.