티스토리 뷰

이번주에는 JWT 를 활용한 회원가입 및 게시글 구현을 하였다.

 

저번주에 구현한 게시글 프로젝트에 회원가입 및 JWT를 이용한 회원가입 및 로그인 연동을 추가하였다.

 

백엔드 로직만을 구현하였고 Postman을 이용하여 테스트 하였다.

 

#요구사항 및 해결 방법 

 

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
더보기
작성한 BoardControll 형식

 

BoardService 에서 signup 로직

 

 

2. 로그인API

  • username, password를 Client에서 전달받기
  • DB에서 username을 사용하여 저장된 회원의 유무를 확인하고 있다면 password 비교하기
  • 로그인 성공 시, 로그인에 성공한 유저의 정보와 JWT를 활용하여 토큰을 발급하고, 발급한 토큰을 Header에 추가하고 성공했다는 메시지, 상태코드 와 함께 Client에 반환하기
더보기
Login 로직

 

 

 

#추가적인 요구사항

  1. 전체 게시글 목록 조회 API
    • 제목, 작성자명(username), 작성 내용, 작성 날짜를 조회하기
    • 작성 날짜 기준 내림차순으로 정렬하기
더보기
BoardService 에서 전체 조회
BoardControll에서

 

//전체 게시글을 for문을 이용해서 뽑아내려 하였지만 지저분하다고 생각하고

구글링을 하던 도중 stream과 collect를 이용하여 뽑아내는 방법을 발견하였다.

 

 

  1. 게시글 작성 API
    • 토큰을 검사하여, 유효한 토큰일 경우에만 게시글 작성 가능
    • 제목, 작성자명(username), 작성 내용을 저장하고
    • 저장된 게시글을 Client 로 반환하기
더보기
BoardService의 게시글 생성 로직
BoardControll의 로직

 

 

  1. 선택한 게시글 조회 API
    • 선택한 게시글의 제목, 작성자명(username), 작성 날짜, 작성 내용을 조회하기 (검색 기능이 아닙니다. 간단한 게시글 조회만 구현해주세요.)
더보기
BoardService의 특정 게시글 조회
BoardController의 특정 게시글 조회

 

  1. 선택한 게시글 수정 API
    • 토큰을 검사한 후, 유효한 토큰이면서 해당 사용자가 작성한 게시글만 수정 가능
    • 제목, 작성 내용을 수정하고 수정된 게시글을 Client 로 반환하기
더보기
BoardService의 특정 게시글 수정
BoardController의 특정 게시글 수정
  1. 선택한 게시글 삭제 API
    • 토큰을 검사한 후, 유효한 토큰이면서 해당 사용자가 작성한 게시글만 삭제 가능
    • 선택한 게시글을 삭제하고 Client 로 성공했다는 메시지, 상태코드 반환하기
더보기
BoardService의 특정 게시글 삭제

 

BoardController의 특정 게시글 삭제

 

# API 명세서

Method URL Request Response
Post /api/user/signup
{
    "username":"username1",
    "password":"password1"
    }
{
    "가입이 완료되었습니다."
    }
Post /api/user/login
{
    "username":"username1",
    "password":"password1"
    }
{
    "로그인이 완료되었습니다."
    }
Get  /api/posts -
{
    "createdAt""2022-12-09T14:45:34.5844743",
    "modifiedAt""2022-12-09T14:45:34.5844743",
    "id"1,
    "username""username1",
    "text""text1",
    "title":"title2"
}
{
    "createdAt""2022-12-09T14:45:34.5844743",
    "modifiedAt""2022-12-09T14:45:34.5844743",
    "id": 2,
    "name""username1",
    "text""text2",
    "title":"title2"
}
Get /api/posts/{id} -
{
    "createdAt""2022-12-09T14:45:34.5844743",
    "modifiedAt""2022-12-09T14:45:34.5844743",
    "id"1,
    "username""username1",
    "text""text1",
    "title":"title1"
}
Post /api/posts
{
    "text":"text1",
    "title":"title1"
    }
{
    "createdAt""2022-12-09T14:45:34.5844743",
    "modifiedAt""2022-12-09T14:45:34.5844743",
    "id"1,
    "username""username1",
    "text""text1",
     "title":"title1"
}
Put /api/posts/{id}
{
    "text":"text2",
     "title":"title1"
    }
{
    "createdAt""2022-12-09T14:45:34.5844743",
    "modifiedAt""2022-12-09T14:45:34.5844743",
    "id": 2,
    "username""username1",
    "text""text2",
     "title":"title1"
}
Delete /api/posts/{id} - {
     "success":"true",
}

 

 

# ERD 설계

 

#어려웠던 점

-Board라는 Entity에서 User이라는 Entity의 username을 가져와서 게시글의 저장하고

게시글을 조회할 때는 가져온 User객체에서 username이라는 작성자 이름을 가져오는

특정 로직을 구현하는데 애를 먹었다.

 

-Entity와 Entity끼리의 one to many관계, 

Board라는 객체에서 클라이언트에게 보여줄 ResponseDto의 관계를 이해할 수 있었다.

 

이번 과제에는 실행만 되길 바라는 마음으로 겨우 과제 시간에 맞춰 완성하였다.

어노테이션의 의미, Comment와 Board 의 관계를 잘 이해하지 못했고 주변 사람들에게 물어보며 겨우 구현하였다.

다음 과제까지 이번에 구현한 과제를 공부하며 이해하고 리펙토링 할 수 있는 실력을 키워야겠다.

Service에서 인증 인가를 하지 않고 Controller 부분에서 인증 인가를 다 끝낸 후 Service로 넘겨줄 수 있도록 연습하고,

객체의 책임과 역할에 대해 더 고민하고 작성 해야겠다.

 

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/12   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함