인프런 커뮤니티 질문&답변

코딩먹는하마님의 프로필 이미지
코딩먹는하마

작성한 질문수

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

상품 수정

테스트용 데이터 추가하기 질문

작성

·

296

·

수정됨

0

테스트용 데이터를 추가하기 위해 아래와 같은코드를 만들었습니다.

@Component
@RequiredArgsConstructor
public class TestDataInit {

    private final ItemService itemService;
    private final ItemRepository itemRepository;
    /**
     * 테스트용 데이터 추가
     */
    @PostConstruct
    public void init() {
        itemService.saveItem(new Book("김영한","츨핀시한빛"));
        itemService.saveItem(new Book("호날두","출판사멩구"));
        
        //오류 발생//
        itemRepository.save(new Book("a","출판사a"));
        itemRepository.save(new Book("b","출판사b"));

}

}

한번은 itemService를 이용하여 값을 넣었고 다른 한번은 itemRepository를 이용하여 값을 넣었습니다.

제 단순한 생각으로는 '어차피 itemService는 itemRepository에 바로 위임을하니 바로 itemRepository로 저장하자' 여서 실행했더니

localhost에서 연결을 거부했습니다. 오류가 나왔습니다.

<질문>

왜 itemRepository로 저장하면 안되고 itemService로만 저장해야 데이터가 추가되는 지 궁금합니다.

답변 3

0

저도 비슷한 문제가 발생했었는데

JPA는 Transactional 안에서 데이터베이스에 대한 모든 수정작업이 이루어져야 합니다.

service에서는 @Transactional로 트랜잭션 안에서 로직이 수행되지만

repository에서는 트랜잭션이 시작되지 않은 상태에서 접근하기 때문에 오류가 발생하는 것으로 생각됩니다.

0

안녕하세요. 코딩먹는하마님, 공식 서포터즈 David입니다.

질문에 남겨주신 오류 메시지로는 정확하게 파악하기 어렵습니다.

오류 로그 전체를 첨부해 주실 수 있으실까요?

감사합니다.

0

안녕하세요, 인프런 AI 인턴이에요. 테스트용 데이터를 추가하기 위한 코드를 보여주셨는데요. itemService와 itemRepository의 차이점에 대해 알려드릴게요.

itemService는 비즈니스 로직이 구현되어 있는 서비스 클래스이고, itemRepository는 데이터베이스와의 상호작용을 위한 인터페이스나 클래스입니다.

itemService를 통해 데이터를 저장하면, itemService에서 추가적인 로직을 구현하여 데이터를 저장하거나 수정, 삭제할 수 있습니다. itemService는 itemRepository를 주입받아 데이터베이스와의 상호작용을 처리하고, 비즈니스 로직에 따라 데이터를 가공하거나 필요한 검증과정을 거친 후 저장을 합니다.

반면에 itemRepository를 직접 사용하여 데이터를 저장하면, itemService에 구현된 비즈니스 로직을 거치지 않고 바로 데이터베이스에 저장됩니다. 이렇게 되면 itemService에서 추가적인 로직 처리나 데이터의 일관성을 보장하는 기능 등을 활용할 수 없게 됩니다.

따라서, 데이터를 추가하는 과정에 있어서는 일반적으로 itemService를 통해 데이터를 저장하는 것이 좋습니다. itemRepository를 사용하는 경우에는 해당하는 비즈니스 로직을 추가로 처리하거나 데이터의 일관성을 보장할 수 있는 과정을 거쳐야 합니다.

이번 질문에 대한 답변이 도움이 되셨길 바랍니다. 추가로 궁금한 점이 있으면 언제든지 물어보세요. 감사합니다.

코딩먹는하마님의 프로필 이미지
코딩먹는하마

작성한 질문수

질문하기