본문 바로가기
개발/JPA

[JPA] INSERT , UPDATE 하기(Save , SaveAll)

by 코딩하는 흰둥이 2024. 11. 11.

 

JPA 에서 INSERT 와 UPDATE 는

Save() 함수로 동작한다

 

 

Save() - INSERT 하기
@Repository
public interface BoardRepository extends JpaRepository<BoardVo , Long> {
}

JpaRepository 를 상속받는다

<BoardVo, Long> 에서 BoardVo 는 Entity 를 설정한 class 이며, Long 은 PK 컬럼의 데이터 타입이다

 

 

@RestController
@RequestMapping("/api/*")
public class BoardController {

    @Autowired
    private BoardRepository boardRepository;
    
    @PostMapping("/boardSave")
    public void boardSave() throws Exception{

            BoardVo vo = new BoardVo();
            vo.setNo(159L);
            vo.setWriter("흰둥이");
            vo.setTitle("저장 테스트!");
            vo.setContents("insert TEST!!");
            boardRepository.save(vo);
    }
    
}

 

JPA 에서 Save 메서드를 사용하게 되면

SELECT 가 먼저 동작해서 PK 컬럼 데이터를 조회하고

해당 데이터가 없으면 INSERT 가 진행된다

 

저장 되었다

 

 

 

 

SaveAll() - INSERT 하기
@Repository
public interface BoardRepository extends JpaRepository<BoardVo , Long> {
}

JpaRepository 를 상속받는다

 

 

@RestController
@RequestMapping("/api/*")
public class BoardController {

    @Autowired
    private BoardRepository boardRepository;

    @PostMapping("/boardSaveAll")
    public void boardSaveAll() throws Exception{

        // 데이터를 담을 변수
        List<BoardVo> list = new ArrayList<>();

        // 임의의 20개의 데이터 생성 
        for (int i = 0; i < 20; i++) {
            BoardVo vo = new BoardVo();
            vo.setNo(160L + i);
            vo.setTitle(i + " 번째 제목");
            vo.setContents(i + " 번째 글");
            vo.setWriter("흰둥이"+i);

            list.add(vo);
        }
            // 한번에 저장
            boardRepository.saveAll(list);
    }
    
}

 

 

SELECT 가 20번 먼저 실행된다

 

SELECT 할때 해당 데이터가 없으면 INSERT 가 동작한다

 

 

 

Save 와 SaveAll 는 둘 다 저장과 수정의 기능을 하며,

단건 데이터 처리 또는 복수 데이터 처리의 차이가 있다

 

대량의 데이터를 Save() 메서드로 동작할 때와

SaveAll() 메서드로 동작할 때의 시간차이는 유의미하게 크게 차이가 난다

 

 

대량의 데이터를 모두 삽입해야 할 경우

@Id 로 지정된 컬럼에

@GeneratedValue 어노테이션을 적용하면 SELECT 실행 없이 INSERT 가 동작한다

참고하길 바란다

 

 

 

 

Save() - UPDATE 하기
@RestController
@RequestMapping("/api/*")
public class BoardController {

    @Autowired
    private BoardRepository boardRepository;
    
    @PostMapping("/boardSave")
    public void boardSave() throws Exception{

            BoardVo vo = new BoardVo();
            vo.setNo(159L);
            vo.setWriter("흰둥이");
            vo.setTitle("수정 테스트!!!!");
            vo.setContents("update TEST!!");
            boardRepository.save(vo);
    }
    
}

Insert 할 때와 동일한 코드에서 Title 과 Contents 데이터만 수정하였다

 

 

정상적으로 UPDATE 되었다

 

 

 

 

 

SaveAll() - UPDATE 하기
@PostMapping("/boardSaveAll")
public void boardSaveAll() throws Exception{

    // 데이터를 담을 변수
    List<BoardVo> list = new ArrayList<>();

    // 임의의 20개의 데이터 생성
    for (int i = 0; i < 20; i++) {
        BoardVo vo = new BoardVo();
        vo.setNo(160L + i);
        vo.setTitle(i + " 번째 제목 + update 됨");
        vo.setContents(i + " 번째 글 + update 됨");
        vo.setWriter("흰둥이"+i);

        list.add(vo);
    }
        // 한번에 저장
        boardRepository.saveAll(list);
}

Insert 할때와 동일한 코드에서 Title 과 Contents 데이터만 수정하였다

 

SELECT 가 20번 동작하였고

 

 

UPDATE 가 실행되었다

 

 

 

수정된 제목을 확인할 수 있다

(Entity class 에 Created 설정을 잘못 걸어서 오류가 발생하기에 우선 주석 처리하고 실행하였다)

 

 


@GeneratedValue 의 경우

Oracle 을 사용하면 

@GeneratedValue(strategy = GenerationType.IDENTITY) 의

Auto_increment 가 동작하지 않는다

 

@GeneratedValue(strategy = GenerationType.SEQUENCE) 로

선언해야 하며, DB 에서 시퀀스를 생성하여 매칭시켜줘야 한다

 

해당 기능은 다음에 자세히 다루겠다

 

 

댓글