[스프링부트] 18. Blog v2 : REST API Server

문정준's avatar
Apr 03, 2025
[스프링부트] 18. Blog v2 : REST API Server

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. User
1. User
2. Board
2. Board
3. Like
3. Like
4. Reply
4. Reply
5. Exception
5. Exception
6. Intercept
6. Intercept
7. 유효성 검사
7. 유효성 검사

관련 기술

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에서 불러온 값으로 저장함
 
notion image
 

JPA : Dirty Checking

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

Polling

  • 주기적으로 시스템의 상태를 검사하여, 특정한 조건을 만족하면 자료를 처리
    • 이벤트의 주기적 발생 (동기화 처리)
    • EventLoop에서 처리
 
 

JPA : Cascade

  • 양방향 Mapping(ManyToOne & OneToMany)을 통해 연관관계가 형성된 두 테이블 사이에서, Write 동작을 연쇄적으로 작동시킬 수 있는 기술
  • Parent 클래스를 persist하면 변경되었던 child 클래스들도 함께 persist가 진행되어, 연쇄적인 영속화 과정을 만들 수 있음
    • 엔티티 클래스를 직접 넘기지 말고, DTO를 활용하는 것이 효과적
 
✏️

Cascade 사용에 유의해야 할 점

  • 양방향 Mapping 시 FetchType이 LAZY가 걸려도 JSON으로 변환하는 중에는 모든 속성이 Getter로 참조됨
    • Lazy Loading이 발생하며 참조된 클래스를 다시 Getter로 찾음
    • 무한 Getter가 발생하며 프로그램 오류 발생
      • Cascade 사용 시 연관된 클래스의 라이프사이클을 숙지해야 함
 
notion image
 

AOP (Aspect - Oriented Programming)

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

AOP 적용 방법 1

  1. Annotation 제작 후 Pointcut(별칭) 등록
  1. Advice 제작
  1. Pointcut 적용
💡

AOP 적용 방법 2

  1. 이미 만든 Annotation을 Pointcut(별칭) 등록
  1. Advice 제작
  1. Pointcut 적용
💡

AOP 적용 방법 3 : Execution Expression

  1. 정규 표현식 작성
  1. Pointcut(별칭) 등록 후 Advice 제작
  1. Pointcut 적용
 
Share article

sxias