패키징 된게 jar 파일이 웹 서버에 배포에 되어야 한다. 그래야 서비스가 가능해 짐

aop 도 가져와야하는데 저기엔없기 때문에 추후에 설치 예정

1. 프로젝트 환경 설정
- application 에는
spring.profiles.active=dev
- 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
- 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
추가그 다음 엔티티(테이블) 만든다.

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;
}


유저 레파지토리 save 는 jpa 에서만드는거라 굳이 테스트 안해도 된다.
Spring Boot에서 게시글 수정 기능 구현 및 테스트 과정
1. GitHub Fork와 동기화 작업

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면 컨트롤러 진입안됨
}
}
팀원을 위해 주석 달아놓았다.

이 메세지는
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";
}
컨트롤러에서도 세션을 확인하고 있지만 이미 인터셉터에서 설정을 마쳐놓았기 때문에 문제가 발생하지 않음


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