[내일배움캠프] #211118 💻 TIL 💻

📚 SpringBoot

📌 JPA 의 영속성 컨텍스트

✔ 영속성 컨텍스트란 ?

  • 엔티티를 영구 저장하는 환경
  • 애플리케이션과 데이터베이스 사이에서 객체를 보관하는 논리적개념
  • entitymanagerfactory에서 Transaction 단위로 요청이 올 때마다 생성 비용이 거의 없는 EntityManager을 생성하는데 이 때 EntityManager는 요청별로 한 개씩 할당된다 => 여러 스레드가 동시에 접근하면 동시성 문제가 발생함 => 이 때 EntityManager가 생성되면 논리적 개념인 영속성 컨텍스트가 1:1로 생성됨

✔ 영속성 컨텍스트의 존재 이유 ?

  • entityManager.persist(엔티티) 를 하면 영속성 컨텍스트의 1차 캐시에 저장된다
    (DB저장은 안됨) commit 시점에 영속성 컨텍스트에 있는 정보들이 DB에 쿼리로 날라감

  • 조회를 할 경우 1차 캐시에 없을 경우 DB에서 직접 조회하고 1차 캐시에 저장 후 반환한다. 있는 경우에는 1차 캐시에 존재하는 해당 엔티티를 바로 반환

=> 요청이 시작되면 영속성 컨텍스트를 생성하고 끝나면 영속성 컨텍스트를 지우기 때문에 이때 1차 캐시도 삭제됨 따라서 애플리케이션 전체에서 공유하는 것이 아니다

  • 같은 데이터를 반복해서 조회해도 영속성 컨텍스트는 1차 캐시에 있는 같은 인스턴스 반환 => ==비교 보장

📌 게시판 글 저장 (ajax로 다시)

  • ✔ index.html script 부분
function writeAticle() {
            $.ajax({
                type: "POST",
                url: "/article",
                contentType: 'application/json; charset=utf-8',
                data: JSON.stringify({content: $("#content").val()}),
                success: function (response) {
                    $("#content").val('');
                    if(confirm("저장된 메시지를 확인하시겠어요?")) {
                        readAticle(response['id'])
                    }
                }
            })
        }

        function readAticle(id) {
            $.ajax({
                type: "GET",
                url: `/article/${id}`,
                success: function (response) {
                    console.log(response['content']);
                    
                    $("#acticle").html(response['content']);
                    //article 태그의 내용을 가져와서 바꿈
                }
            })
        }
  • ✔ Boardcontroller
package com.sparta.springtest.controller;

import com.sparta.springtest.domain.entity.Board;
import com.sparta.springtest.dto.BoardDto;
import com.sparta.springtest.repository.BoardRepository;

import com.sparta.springtest.service.BoardService;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import java.util.List;


@RequiredArgsConstructor
@RestController
public class Boardcontroller {

    private final BoardService boardService;

    @PostMapping("/article")
    public Board setBoard(@RequestBody BoardDto boardDto){
        return boardService.setBoard(boardDto);
    }

    @GetMapping("/article/{id}")
    public Board getBoard(@PathVariable Long id){
        return boardService.getBoard(id);
    }
}
  • ✔ BoardDto
package com.sparta.springtest.dto;

import com.sparta.springtest.domain.entity.Board;
import lombok.*;

import java.time.LocalDateTime;

@Getter
@Setter
public class BoardDto {

    private String content;


}
  • ✔ BoardService
package com.sparta.springtest.service;
import com.sparta.springtest.domain.entity.Board;
import com.sparta.springtest.dto.BoardDto;
import com.sparta.springtest.repository.BoardRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import javax.transaction.Transactional;
import java.util.ArrayList;
import java.util.List;

@RequiredArgsConstructor
@Service
public class BoardService {
    private final BoardRepository boardRepository;

    public Board setBoard(BoardDto boardDto){
        Board board = new Board();
        board.setContent(boardDto.getContent()); 
        //boardDto로 받아온 데이터를 board 엔티티에 저장
        boardRepository.save(board);
        
        return board;
    }

    public Board getBoard(Long id){
        return boardRepository.findById(id).get();
    }
}
  • ✔ Board
import lombok.Setter;

import javax.persistence.*;

@Setter
@Getter // get 함수를 일괄적으로 만들어줍니다.
@Entity // DB 테이블 역할을 합니다.
public class Board extends Timestamped {

    // ID가 자동으로 생성 및 증가합니다.
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Id
    private Long id;

    // 반드시 값을 가지도록 합니다.
    @Column(nullable = false)
    private String content;


}
  • ✔ BoardRepository
package com.sparta.springtest.repository;


import com.sparta.springtest.domain.entity.Board;
import org.springframework.data.jpa.repository.JpaRepository;

public interface BoardRepository extends JpaRepository<Board, Long> {
}

좋은 웹페이지 즐겨찾기