강의

멘토링

로드맵

Inflearn brand logo image

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

김태형님의 프로필 이미지
김태형

작성한 질문수

토비의 스프링 6 - 이해와 원리

JDBC 데이터 액세스 기술

JdbcClient 생성 질문

작성

·

102

0

JdbcOrderRepository 에서 JdbcClient 경우 Bean 으로 주입 받지않고, 생성자에서 직접 사용하셨는데 Bean 주입받는거와 차이가 있을까요? JdbcClient 를 구현하고 있는 DefaultJdbcClient 경우 상태를 가지지않고 datasource 또는 jdbcTemplate 을 이용해서 생성하는 로직밖에 없는데 강의해서 직접 생성하신 부분이 어떤 차이가 있는지 궁금합니다.

아래는 제가 추측 및 생각한 흐름입니다.

  1. EntityManager 경우에는 reuqest 및 transaction context 마다 생성을 해줘야되는데 이와 유사하게 처리를 하신건가?

  2. 그렇다고 하기에 DataConfig 에서 JdbcOrderRepository 는 싱글톤으로 한번만 만들어지는데 이러면 JdbcClient 도 싱글톤 아닌가?

답변 2

0

토비님의 프로필 이미지
토비
지식공유자

날카로운 질문을 주셨네요.

특별한 이유가 있어서 JdbcClient를 직접 만든 것은 아닙니다. JdbcClient가 만들어지는 과정을 보여드리려고 그렇게 코드를 만들었을 뿐입니다. 말씀하신 대로 싱글톤 빈으로 정의해서 가져와서 사용해도 됩니다.

오래 전에 많이 쓰이던 JdbcTemplate도 비슷한 스타일로 생성자에서 DataSource를 받아서 만들어 저장해두고 쓰기도 했거든요. JdbcTemplate, JdbcClient 등은 복잡하지 않은 가벼운 템플릿이고, 특별한 의존성 없이 간단히 만들어서, 심지어 스프링 밖에서도 쓸 수 있다는 것을 강조하기 위해서 그렇게 쓰기도 했습니다. 테스트나 main 메소드에서도 바로 사용할 수 있으니까요.
물론 처음에 그런식으로 시작했다가 리포지토리가 많아지면서 계속 중복이 보이면 리팩터링을 통해서 빈으로 추출하는 작업을 하게 될 겁니다.

그 외에 다른 이유로 직접 생성한 것은 아니니, 사용법과 의존 관계를 잘 파악하셨다면 빈으로 등록해두고 편하게 사용하시면 됩니다.

0

안녕하세요, 인프런 AI 인턴입니다. 김태형님.

스프링에서의 빈 주입과 객체 생성에 대한 질문에 대해 설명드리겠습니다. JDBC 관련 객체를 관리하고 사용하는 방법에 대한 내용은 스프링에서 매우 중요한 주제입니다.

질문 요약:

  • JdbcOrderRepository에서 JdbcClientBean으로 주입받지 않고 직접 생성한 이유에 대해 궁금하셨습니다.
  • 특히, JdbcClient가 상태를 가지지 않으므로 빈으로 주입하거나 직접 생성해도 차이가 없어 보이는데, 직접 생성한 이유를 알고 싶으신 것 같습니다.

핵심 설명:

  1. 빈 주입과 직접 생성의 차이:

    • Bean 주입: 스프링은 객체의 생명 주기와 의존성 관리를 돕기 위해 여러 객체를 빈으로 등록하여 DI(Dependency Injection)로 주입합니다. 이는 객체의 상태를 관리하고, 필요에 따라 객체를 재사용할 때 유리합니다.
    • 직접 생성: 상태가 없는 객체, 특히 데이터 액세스 로직에 국한된 경우, 직접 생성하여 사용하는 것이 코드의 의도를 명확히 하고, 단순히 해당 기능만을 사용하는 데 도움이 될 수 있습니다.
  2. 싱글톤 컨텍스트:

    • JdbcOrderRepository가 싱글톤으로 관리되며 JdbcClient도 상태가 없다면 ‘싱글톤 패턴’과 유사하게 동작할 수 있습니다. 이는 메모리 사용 측면에서 이점이 있습니다.
    • DefaultJdbcClient가 상태를 가지지 않는다면, 여러 곳에서 공유되더라도 동일한 설정을 활용해 일관된 동작을 보장합니다.

결론:

JdbcClient나 유사한 유틸리티 객체는 별도의 상태를 저장하지 않고, 서비스나 DAO 내부에서 재사용되는 단순한 처리 로직일 경우 직접 생성하여 각자의 역할을 명확히 하는 경우도 많습니다. 이는 상태 관리와 관계없이 객체의 사용 목적에 충실할 수 있도록 돕기 때문입니다.

추가적으로 EntityManagerDataSource는그 특성 상 다르게 관리됩니다. 전자는 데이터베이스 연결 컨텍스트와 직접 맞물려 관리자에 의해 적절하게 풀 관리 및 트랜잭션 관리가 강화되어야 하고, 후자는 필요시 즉각 사용할 수 있도록 쉽게 주입할 수 있는 형태를 지닙니다.

아래의 유사한 질문과 답변 링크를 보면 이해하는 데 도움이 될 수 있습니다:
- 스프링의 빈 관리와 상태 없는 객체 사용

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

김태형님의 프로필 이미지
김태형

작성한 질문수

질문하기