[明日の学習キャンプ]#211118💻 TIL 💻


📚 SpringBoot


📌 JPAの永続コンテキスト


✔持続性コンテキストは何ですか?

  • 永久記憶エンティティの環境
  • アプリケーションとデータベースの間にオブジェクトを格納する論理概念
  • entitymanagerfactoryはTransaction単位で要求されるたびに作成コストがほとんどないEntity Managerを生成します.この場合Entity Managerは要求に応じて1つの=>複数のスレッドを割り当てて同時にアクセスすると同期の問題が発生します=>Entity Managerを作成すると論理概念の永続性コンテキストが1:1で生成されます.
  • ✔持続性コンテキストの存在原因


  • entityManager.永続化(エンティティ)は、永続性コンテキストのメインキャッシュに格納されます.
    (DBを保存しない)コミットすると、永続性コンテキストの情報がクエリーとしてDBに送信されます

  • クエリーがプライマリ・キャッシュにない場合は、DBで直接クエリーし、プライマリ・キャッシュに保存して戻ります.存在する場合は、メインキャッシュに存在する対応するエンティティをすぐに返します.
  • =>要求の開始時に永続性コンテキストを作成し、終了時に永続性コンテキストをクリアするため、プライマリ・キャッシュも削除されるため、アプリケーション全体で共有されるわけではありません.
  • 同じデータを繰り返しても、永続性コンテキストはメインキャッシュの同じインスタンス=>==保証された比較を返します
  • 📌 掲示板記事の保存(ajaxの再使用)

  • ✔ index.htmlスクリプト部
  • 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> {
    }