- 연관관계에 있는 객체를 생성할 때, 객체만 생성하면 저장을 하지 않았지만 객체가 저장되는 현상 확인
- 이유를 찾지 못함(놓친 기초가 있어서 그렇다고 생각함)
- Chat GPT에 질문을 함
- 질문 1
jpa를 사용할 때, 다대다관계에서 다대다관계 테이블을 생성하고 저장하지 않았을 때 저장되는 이유는 무엇인가? - 답변
JPA(Java Persistence API)는 Java 프로그램에서 데이터베이스를 쉽게 접근할 수 있도록 해주는 프레임워크입니다.
다대다(Many-to-Many) 관계에서, JPA는 기본적으로 다대다 관계 테이블(join table)을 생성하지 않습니다. 그러나, 엔티티 간의 다대다 관계를 표현하기 위해서는 다대다 관계 테이블이 필요합니다. 이때, JPA는 이를 위해 다대다 관계 테이블을 자동으로 생성하고, 저장하는 기능을 제공합니다.
다대다 관계 테이블을 저장하지 않았을 때, JPA는 관계를 표현하는데 필요한 정보만을 기존 테이블에 저장하는 것으로 간주합니다. 이는 JPA의 기본 전략인 객체-관계 매핑(ORM, Object-Relational Mapping)을 사용하는 경우에만 가능합니다.
- 질문 2.
아래의 코드에서 tagStudy를 save() 메서드를 사용하지 않았는데, 왜 데이터베이스에는 tagStudy가 저장되어 있는것일까?
// 태그 수정 By Study-Id
public List<Tag> updateTag(long studyId, List<String> names) {
// 스터디 조회
Study study = studyRepository.findById(studyId).get();
List<Tag> before = findTagsByStudyId(studyId);
List<Tag> after = makeListTags(names);
// before을 기준으로 정렬
for(Tag tag : before) {
// 삭제될 태그
if(!after.contains(tag)) {
TagStudy tagStudies = tagStudyRepository.findByStudyAndTag(study, tag);
study.deleteTagStudy(tagStudies);
tagStudyRepository.delete(tagStudies);
}
else after.remove(tag); // 공통된 태그
}
// 추가할 태그
for(Tag tag : after) {
TagStudy tagStudy = new TagStudy();
tagStudy.setStudy(study);
tagStudy.setTag(tag);
}
return makeListTags(names);
}
- 답변
tagStudyRepository.save() 메서드를 사용하지 않았지만, 코드에서 tagStudy 객체를 생성하면서 자동으로 저장되기 때문입니다. 예를 들어, 아래 코드에서 tagStudy 객체를 생성하면서 데이터베이스에 저장됩니다.
]즉, 트랜잭션이 커밋되면서 tagStudy 객체가 자동적으로 저장되기 때문입니다.
TagStudy tagStudy = new TagStudy();
tagStudy.setStudy(study);
tagStudy.setTag(tag);
'기타 기술' 카테고리의 다른 글
spring 백그라운드 실행 시 로그 남기기 (0) | 2023.06.07 |
---|---|
.gitignore 폴더에서 특정 파일만 추가하기 (0) | 2023.06.07 |
AWS 백그라운 서버 동작 (0) | 2023.06.07 |
Swagger 사용하기 (0) | 2023.04.14 |
OpenAPI를 SpringBoot에 적용하기 (0) | 2023.03.30 |