[v3] SpringBoot 블로그 만들기 -1

개발환경 설정 및 Postman 활용한 테스트
HootJem's avatar
Sep 03, 2024
[v3] SpringBoot 블로그 만들기 -1
패키징 된게 jar 파일이 웹 서버에 배포에 되어야 한다. 그래야 서비스가 가능해 짐
notion image
aop 도 가져와야하는데 저기엔없기 때문에 추후에 설치 예정
notion image

1. 프로젝트 환경 설정

  1. application 에는
spring.profiles.active=dev
  1. application-dev 는 개발용
# 1. UTF-8 server.servlet.encoding.charset=UTF-8 server.servlet.encoding.force=true # 2. H2 spring.datasource.driver-class-name=org.h2.Driver spring.datasource.url=jdbc:h2:mem:test spring.datasource.username=sa # 3. Hibernate spring.jpa.hibernate.ddl-auto=create spring.jpa.show-sql=true spring.jpa.defer-datasource-initialization=true # 4. Dummy spring.sql.init.data-locations=classpath:db/data.sql # 5. Mustache Setting spring.mustache.servlet.expose-request-attributes=true spring.mustache.servlet.expose-session-attributes=true # 6. Query Format spring.jpa.properties.hibernate.format_sql=true # 7. OpenInView spring.jpa.open-in-view=false
  1. application-prod 는 배포용임
# 1. UTF-8 server.servlet.encoding.charset=UTF-8 server.servlet.encoding.force=true # 2. H2 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/blogdb spring.datasource.username=sa spring.datasource.password=root1234 # 3. Hibernate spring.jpa.hibernate.ddl-auto=none # 4. Mustache Setting spring.mustache.servlet.expose-request-attributes=true spring.mustache.servlet.expose-session-attributes=true # 5. OpenInView spring.jpa.open-in-view=false
 

2. 엔티티 및 Repository 설정

여기서 실행하면 db/data.sql 없다고 한다. 더미 데이터 data.sql 추가
그 다음 엔티티(테이블) 만든다.
notion image
dev 로 실행되게 확인
 
v2 복사하여 board Request , user Request ,core 패키지를 만든다.
public interface UserRepository extends JpaRepository<User, Integer> { } 얘는 인터페이스 (new 할 수 업다)
JPA Repository는 기본적인 CRUD 기능을 제공하며, 커스텀 쿼리를 추가로 정의할 수 있습니다. 인터페이스 내부 메서드들은 기본적으로 public이기 때문에 접근 제한자를 생략해도 됩니다.
public interface UserRepository extends JpaRepository<User, Integer> { @Query("select u from User u where u.username=:usrname") User findByUsername(@Param("username") String username); }
 
 
 

3. 서비스 생성

@RequiredArgsConstructor @Service public class UserService { private final UserRepository userRepository; private final UserQueryRepository userQueryRepository; }
notion image
notion image
 
유저 레파지토리 save 는 jpa 에서만드는거라 굳이 테스트 안해도 된다.

Spring Boot에서 게시글 수정 기능 구현 및 테스트 과정

1. GitHub Fork와 동기화 작업
 
notion image
GitHub에서 포크(Fork)한 저장소를 원본 저장소와 동기화(Sync)해야 할 때가 있다. Sync Fork 기능을 사용하면 포크한 저장소를 원본 저장소와 동기화가 가능. 수정된 내용을 Contribute 버튼을 통해 원본 저장소에 Pull Request를 보낼 수 있다.
로컬 환경에서 테스트할 때는 Postman과 같은 도구를 사용하여 API가 정상적으로 동작하는지 확인해야 한다
이때 나는 게시글 수정 기능을 구현했기 때문에 로그인 된 환경 세션 확인 을 해야하는데
@PostMapping("/api/board/{id}/update") public String update(@PathVariable("id") int id, @Valid BoardRequest.UpdateDTO updateDTO, Errors errors) { User sessionUser = (User) session.getAttribute("sessionUser"); boardService.게시글수정(id, updateDTO, sessionUser); return "redirect:/board/" + id; }
User sessionUser = User.builder() .id(1) .username("ssar") .password("1234") .email("ssar@nate.com") .build();
boardController 에서 sussionUser 대신 임의로 세션유저 빌드를 했엇음
 
그러나 service 실행 전 interceptor 가 sessionUser 검사를 하여
로그인된 테스트 환경이 아니기 때문에 401 에러가 무조건 발생함.
public class LoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HttpSession session = request.getSession(); User sessionUser = (User) session.getAttribute("sessionUser"); if (sessionUser == null) { throw new Exception401("인증되지 않았어요"); } return true;//false 면 컨트롤러 진입안됨 } }
 
따라서 유저 세션만드는 빌더 패턴을 인터셉터 내부에 넣고 컨트롤러는 원래대로 돌림
public class LoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HttpSession session = request.getSession(); // User sessionUser = (User) session.getAttribute("sessionUser"); // 1. 아직 로그인이 구현되지 않아서, 강제 세션 만듬 User sessionUser = User.builder() .id(1) .username("ssar") .password("1234") .email("ssar@nate.com") .build(); session.setAttribute("sessionUser", sessionUser); if (sessionUser == null) { throw new Exception401("인증되지 않았어요"); } return true; // false면 컨트롤러 진입안됨 } }
 
팀원을 위해 주석 달아놓았다.
 
notion image
이 메세지는return "redirect:/board/" + id; 게시글 수정 후 해당 페이지 상세보기로 리다이렉트 요청을 하는데 해당 기능이 아직 개발되지 않아 발생함.
 

게시글 수정을 위해선 수정 폼도 접속을 해야함.
수정 기능 구현했다고 내 파트가 끝난 것이 아님…!!!
//서비스 public Board 게시글수정화면(int id, User sessionUser) { Board board = boardRepository.findById(id); if (board.getUser().getId() != sessionUser.getId()) { throw new Exception403("게시글 수정 권한이 없습니다."); } return board; }
//컨트롤러 @GetMapping("/api/board/{id}/update-form") public String updateForm(@PathVariable("id") int id, HttpServletRequest request) { User sessionUser = (User) session.getAttribute("sessionUser"); Board board = boardService.게시글수정화면(id, sessionUser); request.setAttribute("model", board); return "board/update-form"; }
컨트롤러에서도 세션을 확인하고 있지만 이미 인터셉터에서 설정을 마쳐놓았기 때문에 문제가 발생하지 않음
notion image
notion image
Preview 누르면 바로 보인다 👍
 

discard 해서 내거 없애고 머징댄거 받아오면.. 다시 충돌 잡아야한다 😂
pull 받아서 충돌 잡고 다시 풀리퀘스트
 
 
SpringBoot - v3 1. https://inblog.ai/hj/v3-시작-27809 (개발환경 설정 및 post 맨 이용한 api 테스트) 2. https://inblog.ai/hj/v3-springboot-블로그-만들기-2-28708 (댓글 엔티티 생성 및 양방향 매핑)
Share article

[HootJem] 개발 기록 블로그