오늘 공부한 것
* Spring LV2 과제 하기
* Spring 숙련주차 2주차 강의 듣기
☝ 새로운 요구사항을 구현해 보세요!
- 회원 가입 API
- username, password를 Client에서 전달받기
- username은 최소 4자 이상, 10자 이하이며 알파벳 소문자(a~z), 숫자(0~9)로 구성되어야 한다.
- password는 최소 8자 이상, 15자 이하이며 알파벳 대소문자(a~z, A~Z), 숫자(0~9)로 구성되어야 한다.
- DB에 중복된 username이 없다면 회원을 저장하고 Client 로 성공했다는 메시지, 상태코드 반환하기
- 참고자료
- 로그인 API
- username, password를 Client에서 전달받기
- DB에서 username을 사용하여 저장된 회원의 유무를 확인하고 있다면 password 비교하기
- 로그인 성공 시, 로그인에 성공한 유저의 정보와 JWT를 활용하여 토큰을 발급하고, 발급한 토큰을 Header에 추가하고 성공했다는 메시지, 상태코드 와 함께 Client에 반환하기
✌️ 요구사항에 맞게 수정해 보세요!
- 전체 게시글 목록 조회 API
- 제목, 작성자명(username), 작성 내용, 작성 날짜를 조회하기
- 작성 날짜 기준 내림차순으로 정렬하기
- 게시글 작성 API
- 토큰을 검사하여, 유효한 토큰일 경우에만 게시글 작성 가능
- 제목, 작성 내용을 저장하고
- 저장된 게시글을 Client 로 반환하기(username은 로그인 된 사용자)
- 선택한 게시글 조회 API
- 선택한 게시글의 제목, 작성자명(username), 작성 날짜, 작성 내용을 조회하기 (검색 기능이 아닙니다. 간단한 게시글 조회만 구현해주세요.)
- 선택한 게시글 수정 API
수정을 요청할 때 수정할 데이터와 비밀번호를 같이 보내서 서버에서 비밀번호 일치 여부를 확인 한 후- 토큰을 검사한 후, 유효한 토큰이면서 해당 사용자가 작성한 게시글만 수정 가능
- 제목, 작성 내용을 수정하고 수정된 게시글을 Client 로 반환하기
- 선택한 게시글 삭제 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와 음식 Entitiy가 1:1 관계라 가정
1) 단방향 외래 키 주인만이 외래 키를등록, 수정, 삭제 하며 주인 아닌 쪽은 읽기만 가능
@JoinColumn()은 외래 키의 주인이 사용하는 애너테이션으로 컬럼명, null 여부, unique 여부 등
지정가능
2) 양방향 외래 키의 주인 지정시 외래 키의 주인이 아닌쪽에서 지정함 @OneToOne(mappedBy = “외래키
주인인 상대 entity의 외래 키 필드명”)
@JoinColumn()은 외래 키의 주인이 사용하는 애너테이션으로 컬럼명, null 여부, unique 여부 등
지정가능
'항해99' 카테고리의 다른 글
23.09.04 항해 99 16기 주특기 Spring 9일차 (0) | 2023.09.04 |
---|---|
23.08.28~09.03 항해 99 16기 3주차 회고록 (1) | 2023.09.03 |
23.09.01 항해 99 16기 주특기 Spring 7일차 (0) | 2023.09.01 |
23.08.31 항해 99 16기 주특기 Spring 6일차 (0) | 2023.08.31 |
23.08.30 항해 99 16기 주특기 Spring 5일차 (0) | 2023.08.30 |