README
# 스프링부트 블로그 만들기 v2
> HTTP Method : Get, Post 만 사용
>
> ajax만 JSON으로 처리
## 1. 유저 (user_tb)
- 회원가입
- 로그인
## 2. 게시글 (board_tb)
- 게시글 쓰기
- 게시글 목록
- 게시글 상세보기
- 삭제
- 수정
## 3. 게시글 고급 기능 (board_tb)
- 게시글 목록 페이징
- 검색하기
## 4. 좋아요 (love_tb)
- 게시글 좋아요 (ajax)
- 게시글 좋아요 취소 (ajax)
## 5. 댓글
- 댓글 쓰기
- 댓글 삭제
- 댓글 목록보기
## 6. 그 외 기능
- 필터 (Script 보안)
- 유효성검사 자동화 (Valid AOP)
- 인증체크 자동화 (Interceptor)
- 예외처리 (Global Exception Handler)
- 사진 업로드 (MultiPart Form Data / Base64)
## 기술스택
- Springboot 3.3
- JDK 21
- 인텔리J
- H2
## 의존성
- Lombok
- DevTools
- Spring WEB
- JPA
- h2
- MySQL
- Mustache
변경점
- REST API 서버 운영
- JPA 활용 : DTO는 Browser - Controller 간 데이터 이동에만 사용하고, 그 외에는 JPA 활용
- JPA 데이터를 JSON으로 처리해서 저장, 클라이언트에서 요청 시 데이터만 던짐
- 이때 사용하는 Controller가 APIController
- 실무에서는 별개의 서버로 운영
- 기존 컨트롤러 : HTTP Methods + HTML만 뿌리고, 최초 렌더링 이후 렌더링은 관여 X
- CSR ( Client-Side Rendering )
- 그 외 추가 기능 : README 참고
기능
1. User2. Board3. Like4. Reply5. Exception6. Intercept7. 유효성 검사관련 기술
JPA : Persistence Context
- JPA를 활용하면, 별도의 DTO를 매핑하지 않고, Entity 클래스에 Relation Mapping
- 이는 JPA의 특성인 Persistence Context을 활용한 것
- PC (Persistence Context) : 영속성 컨텍스트, Entity를 영구적으로 저장할 수 있는 환경
- 본 서버 프로그램 내부의 경우 DB가 이에 해당함
- Controller, Service, Repository에 사용되는 user 객체는 저장되지 않은 객체 : 비영속
- em.persist(user) 함수를 통해 JPA는 user 객체를 PC 영역에 포함 : 이후 user 객체는 영속화
- 이때, user 객체는 id, createdAt 등의 값이 부여되지 않음 : null 값을 들고 있음
- PC 영역에서 user 객체의 primary key 속성을 살핌
- primary key가 null일 경우, JPA는 user 객체를 DB에 insert
- 이때, default 값을 가진 id와 createdAt 값이 DB에 자동으로 저장됨
- 저장된 값을 DB에서 읽어와서 user 객체와 동기화
- 이때, 비어있던 값을 DB에서 불러온 값으로 저장함

JPA : Dirty Checking
- JPA를 이용한 DB 조회 시, JPA는 PC 영역에 조회한 DB 정보를 캐시 메모리로 저장
- 이때, 데이터 내에 변경사항이 있다면 이 부분을 자동으로 인식
- Transaction이 끝날 때 자동 Update
- 데이터 내에 남은 변경사항을 dirty라고 하며, 이를 체크하여 update하는 행위를 더티 체킹 (dirty checking)
- update 쿼리가 필요없으므로 코드의 복잡성을 줄일 수 있음

Polling
- 주기적으로 시스템의 상태를 검사하여, 특정한 조건을 만족하면 자료를 처리
- 이벤트의 주기적 발생 (동기화 처리)
- EventLoop에서 처리
JPA : Cascade
- 양방향 Mapping(ManyToOne & OneToMany)을 통해 연관관계가 형성된 두 테이블 사이에서, Write 동작을 연쇄적으로 작동시킬 수 있는 기술
- Parent 클래스를 persist하면 변경되었던 child 클래스들도 함께 persist가 진행되어, 연쇄적인 영속화 과정을 만들 수 있음
- 엔티티 클래스를 직접 넘기지 말고, DTO를 활용하는 것이 효과적

AOP (Aspect - Oriented Programming)
- 관심사 분리를 통해 코드의 모듈화를 개선하기 위한 기법
- 코드의 가독성, 유지/보수 향상
- Aspect 생성: 로깅 기능(Advice)을 포함하는 Aspect를 정의 (클래스 생성)
- Advice 정의: 메서드 실행 전후에 로그를 남기는 코드를 작성 (수행할 메서드 생성)
- Pointcut 설정: 로깅 기능을 적용할 메서드를 결정
- 모든 public 메서드에 로깅을 적용하려면 해당하는 패턴을 Pointcut에 지정 (깃발에 별칭)
- Advice 적용: 설정한 Pointcut에 따라 메서드 실행 전후에 로그를 남기는 Advice가 실행 (PointCut(별칭) 적용)
Share article