본문 바로가기

Backend/Spring | SpringBoot

[JPA] Insert 방법

반응형

@Query(value = "INSERT INTO board (BOARD_SEQ, TITLE, CONTENT, BOARD_CTGR, BOARD_STATUS, MEMBER_ID)
VALUES ((SELECT max(BOARD_SEQ)+1 FROM board), :title, :content, :boardCtgr, :boardStatus, :memberId)",
nativeQuery = true)
    Board insertBoard(Board board);

보통은 save로 사용하지만 Query를 이용해 Insert를 해보고 싶었다.

하지만 Entity에서 요소를 못가져온다.

확인하다보니

1. @Query 내에서 직접 INSERT 문을 실행하는 것은 지원되지 않을 수 있음, 대신 JdbcTemplate 같은 다른 방법을 사용하는 것을 고려해야 할 가능성 존재
2. Board insertBoard(Board board); 메소드 시그니처는 save()와 유사한 작업을 위해 설계되었으며, 이 경우에는 파라미터로 전달된 board 객체에서 값을 추출하여 쿼리의 파라미터로 사용하는 방식으로 작성되어야 함

라고 한다.

 

복세편살 그냥 save메서드를 사용하자


+ ) save를 사용하는데 기존에 데이터가 있어 auto increase가 되지 않는다면??

 

primary key 위반으로 인해 에러가 발생한다

 

Entity에서 @GeneratedValue(strategy = GenerationType.IDENTITY)로 선언되어 있음에도 auto_increase가 적용되지 않는다.

 

Sol1) 초기 적재하는 .sql파일에 ID값을 지움

Sol 2) 테스트 DB와 앱 DB 맞추기

@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)

추가

Sol 3) H2 DB에 Compatibility 적용

# application.yaml
spring:
  config.activate.on-profile: testdb # 프로파일 이름 등록
  datasource:
    url: jdbc:h2:mem:board;mode=mysql # 핵심!
    driver-class-name: org.h2.Driver
@ActiveProfiles("testdb") # testdb라는 이름을 가진 프로파일을 적용
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@DataJpaTest
class JpaRepositoryTest {
	...
}

 

++ ) 모든 테스트에 "testdb" 프로파일을 적용(yml)

spring:
  config.activate.on-profile: testdb
  datasource:
    url: jdbc:h2:mem:board;mode=mysql
    driver-class-name: org.h2.Driver
  test.database.replace: none # 추가!!
반응형