패키징 된게 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=false2. 엔티티 및 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

