본문 바로가기

항해99

23.09.02 항해 99 16기 주특기 Spring 8일차

오늘 공부한 것

Spring LV2 과제 하기

* Spring 숙련주차 2주차 강의 듣기

 

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

  1. 회원 가입 API
    • username, password를 Client에서 전달받기
    • username은 최소 4자 이상, 10자 이하이며 알파벳 소문자(a~z), 숫자(0~9)로 구성되어야 한다.
    • password는 최소 8자 이상, 15자 이하이며 알파벳 대소문자(a~z, A~Z), 숫자(0~9)로 구성되어야 한다.
    • DB에 중복된 username이 없다면 회원을 저장하고 Client 로 성공했다는 메시지, 상태코드 반환하기
    • 참고자료
      1. https://mangkyu.tistory.com/174
      2. https://ko.wikipedia.org/wiki/정규_표현식
      3. https://bamdule.tistory.com/35
  2. 로그인 API
    • username, password를 Client에서 전달받기
    • DB에서 username을 사용하여 저장된 회원의 유무를 확인하고 있다면 password 비교하기
    • 로그인 성공 시, 로그인에 성공한 유저의 정보와 JWT를 활용하여 토큰을 발급하고, 발급한 토큰을 Header에 추가하고 성공했다는 메시지, 상태코드 와 함께 Client에 반환하기

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

  1. 전체 게시글 목록 조회 API
    • 제목, 작성자명(username), 작성 내용, 작성 날짜를 조회하기
    • 작성 날짜 기준 내림차순으로 정렬하기
  2. 게시글 작성 API
    • 토큰을 검사하여, 유효한 토큰일 경우에만 게시글 작성 가능
    • 제목, 작성 내용을 저장하고
    • 저장된 게시글을 Client 로 반환하기(username은 로그인 된 사용자)
  3. 선택한 게시글 조회 API
    • 선택한 게시글의 제목, 작성자명(username), 작성 날짜, 작성 내용을 조회하기 (검색 기능이 아닙니다. 간단한 게시글 조회만 구현해주세요.)
  4. 선택한 게시글 수정 API
    • 수정을 요청할 때 수정할 데이터와 비밀번호를 같이 보내서 서버에서 비밀번호 일치 여부를 확인 한 후
    • 토큰을 검사한 후, 유효한 토큰이면서 해당 사용자가 작성한 게시글만 수정 가능
    • 제목, 작성 내용을 수정하고 수정된 게시글을 Client 로 반환하기
  5. 선택한 게시글 삭제 API
    • 삭제를 요청할 때 비밀번호를 같이 보내서 서버에서 비밀번호 일치 여부를 확인 한 후
    • 토큰을 검사한 후, 유효한 토큰이면서 해당 사용자가 작성한 게시글만 삭제 가능
    • 선택한 게시글을 삭제하고 Client 로 성공했다는 메시지, 상태코드 반환하기

오늘은 드디어 Lv2 과제 마무리를 했다

 

사실 어제 API와 ERD를 올리지 못하였다

 

1. API 명세

기능 URL Method Request Header Request Response Response header
회원가입 /api/user/signup post   username,
password
"msg" :" 회원가입 성공"
"statusCode":200
 
로그인 /api/user/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
 

 

2. ERD

 

어제는 회원가입 API를 구현했다면

오늘은 선택 게시글 수정을 구현해 보았다

 

BoardService 에서 아래와 같이 구현하였는데

Postman에서 이상하게 username이 비었다는 메세지가 출력되었다

 

Board Service
@Transactional
    public ResponseEntity<BoardResponseDto> updateBoard(Long id, BoardRequestDto requestDto, String tokenValue) {
        // JWT 토큰 substring
        String token = jwtUtil.substringToken(tokenValue);

        // 토큰 검증
        if (!jwtUtil.validateToken(token)) {
            throw new IllegalArgumentException("Token Error");
        }

        // 토큰에서 사용자 정보 가져오기 (토큰에서 getBody로 Claims 가져옴)
        Claims info = jwtUtil.getUserInfoFromToken(token);

        // 사용자 username
        String username = info.getSubject();

        // DB에 존재 하는지 확인
        Board board = findBoard(id);
        if(board.getUsername().equals(username)) {
            board.update(requestDto);
            BoardResponseDto dto = new BoardResponseDto(board);
            dto.setStatusCode(String.valueOf(HttpStatus.OK.value())); // statusCode에 404 값으로 입력
            return ResponseEntity.status(HttpStatus.OK).body(dto);
        }else{
            BoardResponseDto dto = new BoardResponseDto(board);
            dto.setStatusCode(String.valueOf(HttpStatus.NOT_FOUND.value())); // statusCode에 404 값으로 입력
            return ResponseEntity.status(HttpStatus.NOT_FOUND).body(dto);
        }

뭐지? 왜지? 라고 페어분과 엄청 고민했는데 원인은 이것이었다

Postman에서는 username을 기입하지 않고 작성했는데

Board 에서 username을 지우지 않아서 이게 자꾸 없다고 오류가 발생했던 것이었다

알고보면 진짜 별거 아닌 오류였지만 당시에는 머리가 정말 지끈 거렸다

Board
변경전 변경후
public void update(BoardRequestDto requestDto){
        this.username = requestDto.getUsername(); 
        this.contents = requestDto.getContents();
        //this.password = requestDto.getPassword();
        this.title = requestDto.getTitle();
public void update(BoardRequestDto requestDto){
        this.contents = requestDto.getContents();
        //this.password = requestDto.getPassword();
        this.title = requestDto.getTitle();

 

이후에는 Spring 숙련주차 2주차 강의를 들었다

 

RestTemplate 서버에서 다른 서버로 간편하게 요청 할 수 있게 하는 것

 

Entity 연관관계 DB 테이블에서는 테이블 사이의 연관관계를 FK(외래 키)로 맺을 수 있고 방향 상관없이 조회가 가능

                          Entity에서는 상대 Entity를 참조하여 Entity 사이의 연관관계를 맺을 수 있다.

                          하지만 상대 Entity를 참조하지 않고 있다면 상대 Entity를 조회할 수 있는 방법이 없다.

                          따라서 Entity에서는 DB 테이블에는 없는 방향의 개념이 존재함

                          서로 Entitiy를 참조하고 있다면 양방향 아니면 단방향

 

1:1 관계 @OneToOne 애너테이션 사용 고객 Entity와 음식 Entitiy1:1 관계라 가정

               1) 단방향 외래 키 주인만이 외래 키를등록, 수정, 삭제 하며 주인 아닌 쪽은 읽기만 가능

                               @JoinColumn()은 외래 키의 주인이 사용하는 애너테이션으로 컬럼명, null 여부, unique 여부 등

                               지정가능

               2) 양방향 외래 키의 주인 지정시 외래 키의 주인이 아닌쪽에서 지정함 @OneToOne(mappedBy = “외래키

                               주인인 상대 entity의 외래 키 필드명”)

                               @JoinColumn()은 외래 키의 주인이 사용하는 애너테이션으로 컬럼명, null 여부, unique 여부 등

                               지정가능