묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 핵심 원리 - 기본편
싱글톤패턴 DIP 위반
[질문 내용]싱글톤 패턴 문제점에서 getInstance() 사용시 DIP를 위반한다고 하신 점이 이해가 잘 안가서 직접 구현해보았습니다. 제가 이해한 내용이 맞나요...? [구현 내용]싱글톤 객체의 의존성 주입에 관한 문제이므로, SingletonService에 주입한 SingletonRepository를 생성하였습니다.public class SingletonRepository { private static final SingletonRepository instance = new SingletonRepository(); public static SingletonRepository getInstance() { return instance; } private SingletonRepository(){} } SingletonService에 SingletonRepository 필드를 추가합니다.public class SingletonService { private SingletonRepository singletonRepository; ... }DIP를 지키기 위해선, DI를 해야합니다. 하지만 SingletonService에 의존관계를 주입할 수 있는 방법이 없습니다...생성자 주입 방법: 추가 객체 생성을 막기 위해 생성자를 막아놓았으므로 불가.필드 주입, setter 주입, 일반 메서드 주입: 스프링 기술, 순수 자바 코드로 주입 불가.클라이언트코드인 SingletonService가 SingletonRepository를 사용하기 위해 다음과 같이 구현체에 의존해야 합니다. public class SingletonService { private SingletonRepository singletonRepository = SingletonRepository.getInstance(); ... }따라서 순수 자바 코드로 싱글톤 패턴 구현 시 DIP를 위반합니다.
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
싱글톤에서 ConcurrentHashMap을 쓰더라도 map객체가 공유됩니다...
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]@RestController @RequestMapping("/test") public class TestController { private Map<String, Object> map = new ConcurrentHashMap(); @ModelAttribute private void data() { map.put("data", "abcd"); } @GetMapping("/data1") public Response<Map<String,Object>> datas1() throws InterruptedException { map.remove("api"); synchronized (map) { map.put("api", "efgh"); } Thread.sleep(3000); return Response.success(map); } @GetMapping("/data2") public Response<Map<String,Object>> datas2() { map.remove("api"); synchronized (map) { map.put("api", "ijkl"); } return Response.success(map); } } 위와같이 @ModelAttribute를 메소드레벨에 선언하여 AOP의 안티패턴 느낌으로 사용해보려고 로직을 구현해봤는데싱글톤 동시성 문제를 고려해서 ConcurrentHashMap을 전역변수로 지정하고 사용하는데도data1 요청 후 3초가 지나기전 data2 요청을 하니data1 요청 결과가 data2 요청 결과로 찍힙니다.data1 작업이 종료 되기전(3초이내)에 data2 작업으로 map객체를 초기화 해버리는걸로 보아 map객체가 공유가 되고 있다는것인데...ConcurrentHashmap으로 이러한 동시성 문제가 해결되지 않는 이유가 뭐고,,, ConcurrentHashmap을 사용하여 처리할만한 적절한 코드가 있을까요?추가적으로 private ThreadLocal<Map<String, Object>> map = ThreadLocal.withInitial(ConcurrentHashMap::new); @ModelAttribute private void data() { map.get().put("data", "abcd"); } @GetMapping("/data1") public Response<Map<String,Object>> datas1() throws InterruptedException { map.get().put("api1", "efgh"); Thread.sleep(3000); return Response.success(map.get()); } @GetMapping("/data2") public Response<Map<String,Object>> datas2() { map.get().put("api2", "ijkl"); return Response.success(map.get()); }위와같이 ThreadLocal을 활용하면 이 문제가 해결되긴 합니다.가급적 AI 말고 우리의 리빙레전드 영한이형님께서 직접 답변 해주시길 부탁드리겠습니다 ㅠㅠ
-
미해결스프링 핵심 원리 - 기본편
5. 싱글톤 컨테이너 - 싱글톤 패턴의 단점 부분 질문입니다.
안녕하세요,싱글톤 컨테이너 - 싱글톤 패턴의 단점 부분에서 질문이 있습니다. 스프링 컨테이너가 빈을 싱글톤으로 관리하는 부분에 대해 설명하시는 강의이므로 ["컨테이너에 의한 싱글톤"과 비교하여 "일반 싱글톤 패턴"이 갖는 단점]이라는 측면으로 이해하려 합니다.의존관계상 클라이언트가 구체 클래스에 의존한다 -> DIP를 위반한다. / 클라이언트가 구체 클래스에 의존해서 OCP 원칙을 위반할 가능성이 높다.다른 질문글들을 찾아보니 이 내용은 "컨테이너를 사용하지 않을 경우 싱글톤이 아닌 일반적인 구체 클래스를 클라이언트에서 직접 new 하듯이 클라이언트에서 구체적인 싱글톤 클래스의 getInstance를 호출해야한다"는 점에서 DIP를 위반한다는 내용으로 이해됩니다. 그러면 이 단점은 컨테이너를 사용하지 않을 경우 싱글톤 클래스나 싱글톤이 아닌 클래스나 마찬가지로 갖는 단점인데 싱글톤 패턴의 단점이라고 표현하신 점에서 제가 이해하지못한 차이가 있는지 궁금합니다.테스트하기 어렵다. / 내부 속성을 변경하거나 초기화 하기 어렵다.컨테이너를 사용하면 config에서 의존관계의 구체클래스만 변경하며 객체의 속성 변경이 용이하지만 직접 구현한 싱글톤 패턴은 이미 생성된 static 객체가 존재하므로 내부를 변경해야한다면 1) 싱글톤 클래스의 코드를 고치거나 2) 클라이언트 또는 테스트 코드에서 수정자 등을 이용해야하므로 내부 속성 변경이 번거롭고 따라서 여러 케이스로 테스트가 어렵다는 의미일까요?결론적으로 유연성이 떨어진다. ("DI가 어렵다, 구체 클래스의 getInstance를 다 해줘야 한다, ...")이 부분도 컨테이너가 없을 경우 일반 클래스, 싱글톤 클래스가 갖는 단점이라 생각되는데 싱글톤의 단점이라 표현하신 점에서 제가 이해하지 못한 부분이 있는지 궁금합니다. 감사합니다.
-
해결됨스프링 핵심 원리 - 기본편
@Configuration과 싱글톤
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]스프링 컨테이너의 싱글톤 방식을 확인하기 위해서 강사님의 코드를 똑같이 따라쳤는데 조회되는 값이 동일하지 않고 다릅니다 ㅠㅠ
-
미해결스프링 핵심 원리 - 기본편
싱글톤패턴 사용사례
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요!스프링 컨테이너가 싱글톤 기반이라고 하셨고, 단점도 많은데 실무에서는 어떠한 경우에 싱글톤 패턴이 적용되는지 궁금합니다!
-
해결됨스프링 핵심 원리 - 기본편
싱글톤 질문 드립니다.
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]여기에 질문 내용을 남겨주세요. 싱글톤 컨테이너 강의를 듣다가 의문점이 생겨 테스트 코드를 추가하면서 질문이 생겼습니다. 인스턴스를 생성하지 않고 하나의 객체로 관리하는 것이 싱글톤이라고 이해했습니다. 그래서 다음과 같이 코드를 작성해봤더니 @Test@DisplayName("스프링 컨테이너와 싱글톤")void springContainer() { ApplicationContext applicationContext1 = new AnnotationConfigApplicationContext(AppConfig.class); MemberService memberService1 = applicationContext1.getBean("memberService", MemberService.class); MemberService memberService2 = applicationContext1.getBean("memberService", MemberService.class); System.out.println("memberService1 = " + memberService1); System.out.println("memberService2 = " + memberService2); assertThat(memberService1).isSameAs(memberService2); ApplicationContext applicationContext2 = new AnnotationConfigApplicationContext(AppConfig.class); MemberService memberService3 = applicationContext2.getBean("memberService", MemberService.class); assertThat(memberService1).isSameAs(memberService3);} 위의 코드에서 applicationContext1에서 가져온 빈과 2에서 가져온 빈이 다르다는 것을 확인했습니다. 하나의 스프링 컨테이너에서 관리된다고 생각했는데 아니었네요 그렇다면 ApplicationContext의 인스턴스를 계속 생성해줘야 하니 싱글톤이 아닌것 아닌가요? 잘 이해되지 않네요ㅠ
-
해결됨스프링 핵심 원리 - 기본편
StatefulServiceJavaTest.java 예제 코드 실행 중, 오류에 대한 도움을 부탁드립니다.
싱글톤 방식의 문제점 - 예제코드인 StatefulServiceJavaTest.java 를 인텔리J에서 코딩하다가 2곳에 표시가 되어 있어 문의드립니다. (1) TestConfig 위의 안내처럼 Alt + Enter를 누르면 로 바뀌지만 여전히 TestConfig은 빨간색으로 표시됩니다. 그 이유는 아래 static을 삭제하면 이 부분에서는 특별한 에러가 없지만, 여전히 TestConfig는 빨간색으로 표시됩니다. 즉, 강의 영상과 같은 코드인데 이 2곳 때문에 실행이 되지 않습니다. 무엇이 문제일까요?
-
미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
싱글톤에 관련해서..
안녕하세요. 강의 잘보고 있습니다! 다름이 아니라 현재 강의에서 싱글톤으로 변경하기전 함수형태도 어차피 싱글톤형태 아닌가요?? 단지 클래스 문법을 활용해서 인스턴스화를 통해 싱글톤을 사용하고 있다라는 것을 코드로 보여주기 위함인 것 같아서요! 싱글톤 변경전 함수형도 하나의 인스턴스 서버로 돌아가는 것으로 알고 있어서요!
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
싱글톤관련 질문 드립니다!
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용] 안녕하세요 싱글톤 관련해서 질문드립니다. MemberRepository 가 싱글톤이여서 private static Map<Long, Member> store = new HashMap<>();private static long sequence = 0L; static을 안붙혀도 된다고 하셨는데 정확한 이유가 무엇인지 알수있을까요??
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
프록시 관련해서 질문이 있습니다.
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]영한님 안녕하세요. JPA로드맵, 스프링 로드맵 모두 들으면서 기초 개념을 잡아가고 있습니다. 감사합니다. 다름이 아니라, 학습을 하면서 프록시 객체의 개념이 많이 등장하는데요, 이런 프록시 객체에 대해 궁금한 점이 생겨서 질문드립니다. 스프링이 빈을 싱글톤으로 관리하기 위해 CGLIB 바이트코드 조작을 통해 가짜 프록시 객체를 스프링 빈으로 등록한다고 알고 있습니다. 그리고 스프링 AOP 적용 시에, Pointcut의 대상이 되는 객체(pointcut 대상 메서드가 포함된 객체)에 Advice를 적용하기 위해 CGLIB 또는 JDK 동적 프록시 기술로 프록시 객체를 만든다 배웠습니다. 마지막으로 여기서 JPA에서 지연로딩을 하기 위해 가짜 프록시 객체를 생성하고 실제 프록시 초기화 시점에 DB에서 쿼리를 불러온다고 보았습니다. (--> 이 프록시 객체는 영속성 컨텍스트가 시작될 때 생성되었다가 사라지는 것 같긴 합니다..) 실제로는 더 많은 사례가 있겠지만, 일단 제가 알기로는 이렇게 3가지가 있었던 것 같은데, 이때 생성되는 프록시 객체들은 다 별개의 객체들일까요? 예를 들어 싱글톤 빈으로 등록된 객체가 있는데(CGLIB 프록시), 이 객체가 AOP 적용 대상이라면 CGLIB 혹은 JDK 동적프록시를 통해 또다른 프록시 객체가 생성되는 건지 궁금합니다. 추가로, 지연로딩을 위한 프록시 객체는 영속성 컨텍스트가 시작될 떄 생성되어 영속성 컨텍스트가 종료되면 사라지는 것인지 궁금합니다. 질문이 다소 모호해서 죄송합니다.
-
미해결스프링 핵심 원리 - 기본편
ConfigurationSingletonTest에서 싱글톤 에러(memberRepository가 서로 다름) 문제가 발생합니다
[질문 내용]안녕하세요 좋은 수업해주셔서 수업 잘 수강하고 있습니다! 지금 @Configuration과 싱글톤 강의를 수강중인데, 원래 이 테스트를 진행하면, memberService와 orderService에서 동일한 memberRepository를 반환해주어야 하는 것으로 강의에 나와있는데 제가 코드를 실행하면 서로 다른 memberRepository가 반환되어 질문 드립니다! [AppConfig] [ConfigurationSingletonTest] [에러내용] 아래와 같이 싱글톤이 적용되지 않고, 서로 다른 객체가 생성되네요. 다른 분들의 질문을 보니 AppConfig에서 @Configuration 적용이 안되어있던가, return에 메서드호출(memberRepository()) 이 안된 문제 같은데, 저의 경우에는 다 적용한 것 같아서 질문 드립니다..! 참고로, MemberServiceImpl, OrderServiceImpl에 아래 코드도 붙여둔 상태입니다! // 테스트 용도public MemberRepository getMemberRepository() { return memberRepository;}
-
해결됨스프링 핵심 원리 - 기본편
@Configuration 적용시 클래스에 싱글톤 패턴 구현 안해도 되나요?
@Configuration 적용시 클래스에 싱글톤 패턴 구현 안해도 되나요? 실무에선 어떻게 사용되나요? 현재 DI컨테이너에다가 @Configuration해놓고 메인에 불러와서 쓰고 있는데, 어차피 빈 등록할 때 CGLIB로 싱글톤 형태로 반환해주니까, 여기(AppContext)에 등록된 Bean 클래스 안에 굳이 싱글톤 패턴 적용 안해도 괜찮을까요?
-
미해결스프링 핵심 원리 - 기본편
NetworkClient setUrl 질문
빈 생명주기 콜백 예시 중 빈 생성후 연결단계에서 setUrl로 연결처리 해주셨는데.. 한가지 궁금한건 이전 강의에서 싱글톤 주의점으로 외부에서 빈의 변수를 수정할 수 있으면 바뀔 수 있는 위험이 있으니 저렇게 setUrl을 퍼블릭 메소드로 두면 안되지 않나요? 그런데 또 NetworkClient 생성자에 url 파라메터로 주지말고 역할을 따로 줘야한다고 해서 두가지가 헷갈랍니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
EntityManager 싱글톤
https://www.inflearn.com/questions/158967 먼저 다른 여기 부분에서 질문이 있습니다. "스프링 프레임워크는 여기에 실제 EntityManager를 주입하는 것이 아니라, 사실은 실제 EntityManager를 연결해주는 가짜 EntityManager를 주입해둡니다." 말씀을 하셨는데 풀어서 제가 이해한내용은 가짜로 주입을 하고 실제 비즈니스 로직을 탈때 예시를 들면 사용자A가 사용을 하고 EntityManager 가 실행 될때 실제로 EntityManager를 호출하고 로직이 끝나면 가짜 EntityManager를 주입하고 사용자B가 호출을 하면 가짜 EntityManager가 실제 EntityManager를 호출하여 실행이 되서 싱글톤이긴 하나.. 분기(?) 처리해서 EntityManager를 사용하고 있다라고 이해를 하고 있는데 맞을까요.. 아니라고 하면 풀어서 설명이 가능할까요? 초보적인 질문을 드려서 죄송합니다..
-
미해결스프링 핵심 원리 - 기본편
싱글톤에관련한 질문드립니다.
안녕하세요 선생님 제가 싱글톤개념을 정확히 이해하지 못해 생긴 의문점 질문드립니다. ㅠ 싱글톤이 하나의 객체를 생성하여 해당 객체를 요청때 마다 사용하는 방식이라고 이해했는데 예제에서처럼 필드에 int타입 변수가 있고 해당 변수의 값을 증가시키는 메소드를 실행했을때 해당 변수값이 증가했고 또 다른 곳에서 요청이 왔을때 해당 객체를 사용할텐데 어째서 필드의 변수값이 초기화되는건가요? 같은 객체라면 따로 값을 초기화 해주지 않았다고한다면 해당 변수가 증가된 상태의 객체가 전달이되야하는것이 아닌가라는 의문이 들어 질문드립니다. ㅠ ㅠ