본문 바로가기

분류 전체보기54

Thread Pool 이란 도대체 무엇인가! Thread Pool 동작원리 Thread Pool 필요한 Thread 를 Thread Pool 에 보관하고 관리한다. Thread Pool 에 생성 가능한 Thread 최대치를 관리한다. 톰켓은 최대 200개 기본 설정 ( 변경 가능 ) Thread 가 필요하면, 이미 생성되어 있는 Thread 를 Thread Pool 에서 꺼내서 사용 사용을 종료하면 Thread Pool 에 해당 Thread 를 반납 Thread 가 미리 생성되어 있으므로, Thread 를 생성하고 종료하는 비용(CPU)이 절약되고, 응답 시간이 빠르다. 생성 가능한 Thread 의 최대치가 있으므로 너무 많은 요청이 들어와도 기존 요청은 안전하게 처리할 수 있다. ✨ 최대 Thread 가 모두 사용중이여서 Thread Pool 에.. 2022. 6. 17.
Item40. @Override 애너테이션을 일관되게 사용하라. @Override 메서드 선언에만 달 수 있으며, 이 어노테이션이 달렸다는 것은 상위 타입의 메서드를 재정의 했음을 뜻한다. 아래 예제 코드에서 문제점❗❗ public class Bigram { private final char first; private final char second; public Bigram(char first, char second) { this.first = first; this.second = second; } public boolean equals(Bigram b) { return b.first == first && b.second == second; } public int hashCode() { return 31 * first + second; } public static .. 2022. 6. 13.
Item34. int 상수 대신 열거 타입을 사용하라. 자바에서 열거 타입이 생기기 전까지는 정수 상수를 열거하는 방법을 사용하였다. public static final int APPLE_FUJI = 0; public static final int APPLE_PIPPIN = 1; public static final int APPLE_GRANNY_SMITH = 2; public static final int ORANGE_NAVEL = 0; public static final int ORANGE_TEMPLE = 1; public static final int ORANGE_BLOOD = 2; 🚫 위와 같은 방식의 단점 타입 안전 보장 X 컴파일러가 이해하는 값은 정수이므로 ORANGE_NAVEL 을 건네야 하는 곳에 APPLE_FUJI를 보내고 동등연산자로 비교하.. 2022. 6. 5.
Item31. 한정적 와일드카드를 사용해 API 유연성을 높이라. 일단 와일드카드가 뭐지??? 내가 알고있는 와일드카드는 비장의카드, 좋은카드.. 모 이런의미뿐… 허허;; 와일드카드 제네릭 코드에서 물음표(?) 로 표기되어 있는것으로, 아직 알려지지 않은 타입을 뜻한다. 그럼 제네릭은 뭐지…? 분명.. 많이 들어는봤지만 알아볼 생각을… 지금하면되지..!!!! 제네릭(Generic) 데이터의 타입을 일반화하는것을 의미한다. 클래스나 메소드에서 사용할 내부 데이터 타입을 컴파일 시에 미리 지정하는 방법! 아래와 같이 자바에서 제네릭은 클래스와 메소드에만 다음과 같은 방법으로 선언할 수 있다. T는 타입변수 라고 하며, 임의의 참조형 타입을 의미한다. class MyArray { T element; void setElement(T element) { this.element .. 2022. 6. 4.
빈 생명주기 콜백에 대해 알아보자 빈 생명주기 콜백이라는게 모지? 그냥 내가 이해한 바로는 스프링이 구동될때 DB 연결이나 Network 연결은 미리 해주어야 나중에 연결 지연이 생기는 것이 방지 된다고 한다. 그래서 그때 동작되는 스프링이 구동되고서부터 끝날때까지의 흐름?? 그리고 스프링이 구동되고 의존관계가 주입된 후에 어떤것이 호출되며 종료되기 전에는 어떤것이 호출되는지 그런흐름?? 모 나는 그렇게 이해했는데 아닐수도 ;;; 김영한님의 인프런 스프링 기본편강의 에서는 아래와 같은 흐름으로 동작한다고 하였다! 스프링 컨테이너 생성 → Bean 등록 → 의존관계주입 → 초기화콜백 → 사용 → 소멸전 콜백 → 스프링 종료 스프링은 크게 3가지 방법으로 빈 생명주기 콜백을 지원한다. 1. 인터페이스(InitializingBean, Disp.. 2022. 6. 4.
조회 빈이 2개 이상일 때 해결방법! 조회 빈이 2개 이상일 경우 해결방법! @Autowired 필드명 매칭 빈 조회시 타입으로 매칭이 되지만 동일 타입이 2개이상인 빈에 대해서는 타입 다음 필드(파라미터)명으로 빈을 조회 하게 된다. 따라서 동일 타입에 대해 필드(파라미터)명을 다르게 해주면 빈 충돌이 나지 않게된다! @Autowired public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy rateDiscountPolicy) { // ✅ 이렇게 파라미터명을 rate~로 다르게 해주면 충돌나지 않음! this.memberRepository = memberRepository; this.discountPolicy = rateDiscountPolicy; } @Quali.. 2022. 6. 4.
[Springboot] Execution failed for task ':test' 에러 해결방법 SpringBoot 에서 테스트코드를 Run 했을때 갑자기 잘되던게 아래와 같은 에러 발생!! Execution failed for task ':test' ~~~~~~~~~ 아니 잘되던게 갑자기 왜 안되는거야ㅜㅜㅜㅜㅜㅜ 해결방법❗❗ File → Setting → Gradle 에서 아래를 IntelliJ IDEA 로 변경해주기!! 그럼 아래처럼 깔끔히 성공!! 근데 저렇게 해서 어찌저찌 잘 동작은 하는데,, 이유를 모르겠다 이유를!!!! Junit4가 아니라 5 버전이여야 된다는 글을 봤는데.. 분명 Junit5로 다 한것같은데 갑자기 안돼서 당황;; 이유 아시는 분 계시면 댓글부탁해여ㅜㅜㅜㅜ 2022. 6. 4.
의존관계가 아닐때 옵셔널처리 의존관계로 등록되지 않은 즉, 스프링 컨테이너가 관리하는 빈이 아닌 클래스에 대해 @Autowired 를 쓸때 어떻게 처리할 것인지에 관한 옵셔널 처리를 알아보자 아래에서 나오는 예제의 Member 클래스는 스프링 빈으로 등록되지 않은 일반 자바 클래스이다. @Autowired(required = false) 의존관계가 주입되지 않은 클래스가 하나라도 포함되어 있다면 아예 호출 자체를 하지 않는다. (의존관계가 주입된 클래스를 같이 써주어도 호출 되지 않았음) @Autowired(required = false) public void setNoBean1(Member noBean1) { System.out.println("noBean1 : "+noBean1); } @Nullable 의존관계가 주입되지 않은 .. 2022. 6. 4.
의존관계 주입방법 의존관계 주입 전 주의사항❗ 의존관계 주입은 스프링 컨테이너가 관리하는 스프링 빈이어야 동작한다! 스프링 빈으로 등록되지 않은 일반 자바 클래스 Member 같은 클래스에서 @Autowired 를 아무리 해봐야 소용이 없다!! 생성자 주입 이름 그대로 생성자를 통해서 의존 관계를 주입 받는 방법이다. 또한, 생성자 호출 시점에 딱 1번만 호출되므로 불변, 필수 의존관계에 사용해야한다. private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; @Autowired // ✅ 만약 생성자가 이것 하나뿐이라면 @Autowired 생략가능!! public OrderServiceImpl(MemberRepos.. 2022. 6. 4.
@ComponentScan 과 @Autowired @ComponentScan 탄생배경 기존 스프링에서 빈을 등록할때 하나하나 @Bean 어노테이션을 사용하여 등록을 수동으로 해주어야했다. 하지만 이렇게 수동으로 하는방식은 너무너무 귀찮다아아ㅏ…!!!! 지겨워지겨워 알아서해줘어ㅓㅓㅓ 그래서 나온게 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 @ComponentScan 이라는 어노테이션이 등장!! @ComponentScan 역할 스프링 구동시 @Component 어노테이션이 붙은 클래스를 모두 읽어서 자동으로 빈 등록을 해준다. 이때 빈의 기본 이름은 클래스명을 사용하되 맨 앞글자만 소문자를 사용한다. 직접 지정하고 싶다면 @Component(”merryChristmas”) 이렇게 직접 명시해주면 된다. 또한, @ComponentScan 이 붙은 클래.. 2022. 6. 4.