[내일배움캠프] #211118 💻 TIL 💻
📚 SpringBoot
📌 JPA 의 영속성 컨텍스트
✔ 영속성 컨텍스트란 ?
- 엔티티를 영구 저장하는 환경
- 애플리케이션과 데이터베이스 사이에서 객체를 보관하는 논리적개념
- entitymanagerfactory에서 Transaction 단위로 요청이 올 때마다 생성 비용이 거의 없는 EntityManager을 생성하는데 이 때 EntityManager는 요청별로 한 개씩 할당된다 => 여러 스레드가 동시에 접근하면 동시성 문제가 발생함 => 이 때 EntityManager가 생성되면 논리적 개념인 영속성 컨텍스트가 1:1로 생성됨
✔ 영속성 컨텍스트의 존재 이유 ?
-
entityManager.persist(엔티티) 를 하면 영속성 컨텍스트의 1차 캐시에 저장된다
(DB저장은 안됨) commit 시점에 영속성 컨텍스트에 있는 정보들이 DB에 쿼리로 날라감
-
조회를 할 경우 1차 캐시에 없을 경우 DB에서 직접 조회하고 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> {
}
Author And Source
이 문제에 관하여([내일배움캠프] #211118 💻 TIL 💻), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@dltndudvlzm/내일배움캠프-211118-TIL저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)