자바(35)
-
SpringBootTest에서 생성자 주입 시 @Autowired를 명시해야하는 이유
테스트에서 생성자 주입을 인식하지 못한다? 컨트롤러 테스트 코드 개선을 진행하다 다음과 같은 예외를 발견했습니다. 해당 예외는 테스트를 실행하자마자 발생했고, 내용을 확인해보니 파라미터를 제대로 등록하지 못했다는 내용이 적혀있었습니다. 빈 주입 과정이 올바르게 동작하지 못한다고 생각해 곧바로 테스트 코드의 필드와 생성자 부분을 확인했습니다. 생성자는 하나만 사용하고 있었고, 파라미터로 전달받는 값들 또한 모두 빈으로 등록되어있었습니다. 스프링 빈 생성자 주입 스프링에서 생성자를 하나만 작성하고, 그 파라미터가 모두 빈으로 등록이 되어있다면 @Autowired를 명시하지 않아도 빈 주입이 가능하다고 공식문서에서는 설명하고 있습니다. 실제 Autowired가 명시된 생성자를 찾아서 등록하는 코드는 빈 후처리..
2024.02.25 -
Java Thread, JDK 뒤져보기
오늘 아침 지하철을 타고 오면서 문득 이런 궁금증이 떠올랐습니다. 'cpu 사양에 따라 가용한 쓰레드의 개수는 한정적일텐데, 자바에서는 어떻게 쓰레드의 개수를 마구마구 늘릴 수 있는거지?' 사실 user thread니 kernel thread니 이런저런 이야기를 들어본 적은 있지만 정확하게 알고있지 않다고 생각해 한번 정리해보고자 합니다. Thread의 종류 Thread는 크게 'User Thread', 'kernel Thread', 'Hardware Thread' 세 유형으로 구분해서 설명할 수 있습니다. User Thread User Thread는 어플리케이션을 통해 생성되는 쓰레드를 의미합니다. 쉽게 생각해서 우리가 Java의 new Thread()를 호출하면 User Thread가 생성된다고 생각..
2023.11.14 -
자바 쓰레드 풀! 그게 뭐야? 어떤 게 있어??
이번에는 `자바 쓰레드 풀`에 관해 글을 작성해보려고 합니다! 정확히 말하면 자바에서 쓰레드 풀이 어떤 식으로 구현되어있는지, 그리고 각각 쓰레드 풀 유형에 대해 알아볼 예정입니다. 쓰레드 풀이란? 쓰레드 풀이란 여러 쓰레드를 사전에 만들어 둔 Pool이라고 생각하면 됩니다. 일반적으로 개발에서의 Pool이라는 용어는 어떤 대상들을 생성한 뒤 놔두는 공간이라고 해석할 수 있는데요. 자바에서의 `스트링 풀`은 `문자열들을 생성한 뒤 놔두는 공간`, `쓰레드 풀`은 `쓰레드들을 생성한 뒤 놔두는 공간`으로 풀이해볼 수 있어요! 위와 같이 Pool을 만들어두는 이유는 비용 때문이라고 요약해볼 수 있어요. 한번 생성할 때의 비용이 비싸지만 자주 사용하는 경우엔 이를 매번 생성해서 사용하기보단 한번 생성한 것을 ..
2023.09.17 -
상품 테이블과 주문 테이블에 중복된 칼럼이 있는데 왜 그런거죠?
이번에는 웹 장바구니 미션을 진행했다. 장바구니에 물건을 담고, 이를 주문하는 프로세스를 개발하는 미션을 진행했다. 이러한 비즈니스 요구사항 속에서 구성했던 데이터베이스 테이블은 다음과 같다. 얼핏 보기에는 정규화가 안되어있는 모습을 볼 수 있다. orders_item 테이블을 살펴보면 total_price라는 컬럼이 존재한다. 해당 컬럼은 사실 orders_item 테이블의 quantity 컬럼과 product 테이블의 price 컬럼의 값을 곱하면 구할 수 있는 정보이다. 따라서 이는 정규화가 올바르게 되지 않은 모습을 알 수 있다. 그럼에도 불구하고 위와 같이 구성했던 이유는 상품의 정보가 언제든지 바뀔 여지가 있기 때문이었다. 만약 order_item에서 단순히 수량 정보만 가지고 있다면 나중에 ..
2023.06.07 -
토비의 스프링, 스프링 AOP 뿌수기 (2), 프록시 팩토리 빈
프록시 팩토리 빈 ProxyFactoryBean 스프링에서 제공해주는 프록시팩토리빈을 사용하면 프록시를 생성해서 빈 오브젝트로 등록하는 동작을 해준다. 지난 포스팅에서 소개한 FactoryBean 인터페이스를 구현해서 만드는 방법과의 차이는 FactoryBean 인터페이스를 구현한 경우에는 프록시를 통해 제공해줄 부가기능도 해당 구현 코드 내부에 추가해줘야했다. 반면에 ProxyFactoryBean은 프록시를 생성하는 작업만 담당한다. 그래서 프록시를 통해 제공해줄 부가기능은 별도의 빈에 둘 수 있다. 즉, 부가기능의 분리가 가능하다는 점이다. ProxyFactoryBean에서 생성하는 프록시에서 사용할 부가기능은 'MethodInterceptor'라는 인터페이스를 구현해서 만든다. 이전 포스팅에서 보았..
2023.05.18 -
토비의 스프링, 스프링 AOP 뿌수기 (1), 빌드업
오랜만에 뿌수기 시리즈로 돌아왔다. 그런데 이번에는 토비의 스프링이다. 사실 다음주에 테코톡 발표 주제로 스프링 AOP를 선정했는데, 공식문서만으로는 자료가 매우 미흡해질 것으로 예상되어 이렇게 여러 책들이 소개하는 스프링 AOP에 대해 정리해보고자 한다. 그 중에 가장 먼저 정리하고자하는 책은 '토비의 스프링'에서 설명하는 스프링 aop이다. 토비의 스프링, 스프링 AOP 빌드업 다이내믹 프록시와 팩토리 빈 토비의 스프링에서는 aop를 설명하기 위한 빌드업이 등장한다. 먼저 핵심 기능에 부가기능을 추가했을 때 벌어지는 현상들에 대해서 설명하고 있다. 처음에는 핵심 기능에 로그나 롤백 등의 부가기능을 추가했을 때 코드가 복잡해진다라는 점을 단점으로 꼽는다. 코드가 그렇게 복잡하게 될 경우에는 우리가 원하..
2023.05.17