inblog logo
|
sxias
    스프링부트자바스크립트

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

    문정준's avatar
    문정준
    Apr 03, 2025
    [스프링부트] 18. Blog v2 : REST API Server
    Contents
    README변경점관련 기술JPA : Persistence ContextJPA : Dirty CheckingPollingJPA : CascadeAOP (Aspect - Oriented Programming)

    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] 영속성 컨텍스트(persistence context) 개요 및 특징(feat. Dirty Checking, flush())
    Goals영속성 컨텍스트란?엔티티 생명 주기영속성 컨텐스트의 이점영속성 컨텍스트란?JPA를 이해하는데 가장 중요한 용어는 영속성 컨텍스트(persistence context)다. 우리말로 해석해 보면 ‘엔티티를 영구 저장하는 환경’이라는 뜻이다. JPA를 사용해 엔티티(객체)를 데이터베이스에 저장하기 전에 항상 이 영속성 컨텍스트라는 곳에 먼저 저장해야 한다. 다만, 영속성 컨텍스트에 엔티티를 저장한다고 해서 데이터베이스에 저장되는 것은 아니다. 그럼에도 엔티티를 굳이 영속성 컨텍스트에 먼저 저장하는 이유는 다양한 이점이 있는데, 이는 뒤에서 설명하겠다.엔티티 매니저(EntityManager)로 엔티티를 저장하거나 조회하면 엔티티 매니저는 영속성 컨텍스트에 엔티티를 보관하고 관리할 수 있게 된다. 일반적..
    [JPA] 영속성 컨텍스트(persistence context) 개요 및 특징(feat. Dirty Checking, flush())
    https://bnzn2426.tistory.com/145
    [JPA] 영속성 컨텍스트(persistence context) 개요 및 특징(feat. Dirty Checking, flush())
    • 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] 더티 체킹(dirty checking) 정리
    더티 체킹이란? JPA에서 더티 체킹(dirty checking)이란 영속성 컨테이너가 관리하는 엔티티의 상태를 감지해서, 변경된 부분이 있다면 자동으로 트랜잭션이 끝나는 시점에 데이터베이스에 반영하는 기능이다. 따라서 여기서 말하는 dirty는 “엔티티 데이터의 변경된 부분”을 뜻하며 dirty checking은 변경된 부분을 감지한다는 의미이다. 따라서 개발자가 update에 관련된 쿼리를 작성하지 않아도 되기 때문에, 코드의 복잡성을 줄일 수 있다는 특징이 있다. 그렇다면 어느 상황에서 더티 체킹이 일어나는 지 알아보자. 더티 체킹 조건 영속성 컨텍스트에서 관리되는 엔티티 영속성 컨텍스트는 엔티티를 처음 조회할 때 시작되며, 이후 변경을 감지한다. 준영속/비영속 상태의 엔티티는 더티 체킹의 대상이 ..
    [JPA] 더티 체킹(dirty checking) 정리
    https://everydayyy.tistory.com/157
    [JPA] 더티 체킹(dirty checking) 정리
    • JPA를 이용한 DB 조회 시, JPA는 PC 영역에 조회한 DB 정보를 캐시 메모리로 저장
    • 이때, 데이터 내에 변경사항이 있다면 이 부분을 자동으로 인식
      • Transaction이 끝날 때 자동 Update
      • 데이터 내에 남은 변경사항을 dirty라고 하며, 이를 체크하여 update하는 행위를 더티 체킹 (dirty checking)
      • update 쿼리가 필요없으므로 코드의 복잡성을 줄일 수 있음
     
    notion image
     

    Polling

    • 주기적으로 시스템의 상태를 검사하여, 특정한 조건을 만족하면 자료를 처리
      • 이벤트의 주기적 발생 (동기화 처리)
      • EventLoop에서 처리
    폴링 (컴퓨터 과학)
    폴링(polling)이란 하나의 장치(또는 프로그램)가 충돌 회피 또는 동기화 처리 등을 목적으로 다른 장치(또는 프로그램)의 상태를 주기적으로 검사하여 일정한 조건을 만족할 때 송수신 등의 자료처리를 하는 방식을 말한다. 이 방식은 버스, 멀티포인트 형태와 같이 여러 개의 장치가 동일 회선을 사용하는 상황에서 주로 사용된다. 서버의 제어 장치(또는 프로그램)는 순차적으로 각 단말 장치(또는 프로그램)에 회선을 사용하기 원하는지를 물어본다.
    폴링 (컴퓨터 과학)
    https://ko.wikipedia.org/wiki/%ED%8F%B4%EB%A7%81_(%EC%BB%B4%ED%93%A8%ED%84%B0_%EA%B3%BC%ED%95%99)
     
     

    JPA : Cascade

    <JPA> 알고 쓰는 Cascade(영속성 전이)
    이번 포스팅에서는 쓰면서도 헷갈리던 JPA의 Cascade 옵션에 대해서 정리하겠습니다.일단 기본적으로 Cascade라는 옵션이 등장하게 된 배경부터 알아봅시다. 아래의 코드를 보시죠 @Setter @Getter @Entity public class Parent { @Id @GeneratedValue private Long id; private String name; @OneToMany(mappedBy = "parent") private List&lt;Child&gt; childes = new ArrayList&lt;&gt;(); public void addchild(
    <JPA> 알고 쓰는 Cascade(영속성 전이)
    https://hongchangsub.com/jpa-cascade-2/
    <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)

    CH21 스프링부트 인증 - AOP.pdf
    197.0KB
    • 관심사 분리를 통해 코드의 모듈화를 개선하기 위한 기법
      • 코드의 가독성, 유지/보수 향상
     
    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
    Contents
    README변경점관련 기술JPA : Persistence ContextJPA : Dirty CheckingPollingJPA : CascadeAOP (Aspect - Oriented Programming)

    Sxias ㆍ a32176740@gmail.com

    RSS·Powered by Inblog