Application Context와 여러 Bean 설정 방법 Application Context는 빈들을 설정하고 어디에 의존성을 주입할 건지를 정의하는 것이다. 빈을 설정하는 방법들을 살펴보자 첫번째로는 xml을 사용하는 방식이다. 그 후 main에서 ApplicationContext를 활용해서 빈을 가져와 사용하면 된다. (의존성 주입) public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("application.xml"); String [] beanDefinitionNames = context.getBeanDefinitionNames(); System.out.pri..
스프링 IoC 컨테이너와 빈 IoC 컨테이너란 BeanFactory Bean 설정 및 정의를 읽어들이고, Bean을 구성하고 제공하는 것이다. Bean이란 IoC 컨테이가 관리하는 객체를 말한다. Bean은 IoC 컨테이너에 의해 인스턴스화되고, 관리된다. IoC 컨테이너에 의해 인스턴스화 된 Bean은 getBean을 통해 가져와 사용할 수 있고, @Autowired라는 어노테이션을 사용하여 의존 객체(IoC 컨테이너에 의해 생성된 객체)를 주입받을 수도 있다. IoC 컨테이너와 Bean 스프링 IoC 컨테이너에 등록되어 있는 Bean들은 Scope 자체가 싱글톤으로 구성되어 있다. 라이플사이클 인터페이스 제공 Bean이 만들어지는 시점에서 클라이언트가 임의적으로 하고 싶은 행동을 주입할 수 있다. E..
자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 많은 클래스가 하나 이상의 자원을 의존한다. 맞춤법 검사기(SpellChecker)가 사전(Dicitonary)에 의존하는 예를 확인해보자 //정적 유틸리티 활용 public class SpellChecker { private static final Lexicon dictionary = ...; //정적 유틸리티 private SpellChecker() {} //객체 생성을 방지 public static boolean isValid(String word) {...} public static List suggestions(String typo) {...} } //싱글턴 활용 public class SpellChecker { private final Le..
불필요한 객체 생성을 피하라 똑같은 기능의 객체를 매번 생성하기보다는 객체 하나를 재사용하는 편이 나을 때가 많다. 한 코드의 예를 통해 살펴보자 String s = new String("Effective Java"); String s = "Effective Java"; 첫번 째 문장은 실행될 때마다 String 인스턴스가 새로 만들어진다. 이 문장은 매우 쓸데 없다.. 만약 반복문이나 빈번히 호출되는 메서드 안에 있다면 쓸데없이 해당 인스턴스가 새로 만들어질 수 있다. 그냥 재사용하면 되는데.. 두번 째 문장을 살펴보면 새로운 인스턴스를 매번 만드는 대신 하나의 String 인스턴스를 사용한다. 즉, 반복문이나 빈번히 호출되는 메서드 안에 있어도 가상 머신 안에서 재사용함이 보장되는 것이다 생성자 대신..
인스턴스화를 막으려거든 private 생성자를 사용하라 단순히 정적 메서드와 정적 필드만을 담은 클래스를 만들고 싶을 때가 있을 것이다. 정적 메서드와 정적 필드(static) 사용 시 클래스 인스턴스 없이 호추링 가능 다른 객체와 공유 가능 유틸리티 함수를 만드는데 유용 Math.max(); 추상 클래스로 만드는 것으로는 인스턴스화를 막을 수 없다. 이는 하위 클래스를 만들어 인스턴스화 하면 그만인것을.. 결과적으로, private 생성자를 추가하면 클래스의 인스턴스화를 막을 수 있다. private UtilityClass() { throw new AssertionError(); } 명시적 생성자가 private이니 밖에서 접근 불가하다. 꼭 AssertionError를 던질 필요는 없지만, 클래스 안..
제네릭 제네릭이란 무엇인가? 제네릭은 간단히 말해 데이터 타입을 명시하지 않은 상태를 말한다. 쉽게 생각해보면 클래스의 데이터 타입을 미리 정의하지 않고, 클래스가 인스턴스화 되는 시점에 데이터 타입을 지정해주는 방식이다. 제네릭은 를 활용하여 구현한다. 제네릭을 사용하는 이유는 무엇인가? 제네릭을 사용하는 이유 즉, 장점을 살펴보겠다. 제네릭을 활용하면 강제적인 타입 변환이 발생하지 않아 성능 저하를 방지할 수 있다. 중복 코드를 제거하고 코드의 재사용성을 증진시킨다. 컴파일 시에 타입 오류를 체크하여 안정적으로 데이터 타입을 체크할 수 있다. 하나씩 코드와 함께 살펴보자. 제네릭을 활용하면 강제적인 타입 변환이 발생하지 않아 성능 저하를 방지할 수 있다. 제네릭을 사용하지 않는 코드를 확인해보자 pu..
Private 생성자나 열거 타입으로 싱글턴임을 보증하라 싱글턴이란, 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말한다. 싱글턴을 만드는 방식 두 가지 두 가지 모두 생성자는 private으로 감춰두고, 유일한 인스턴스에 접근할 수 있는 수단으로 public static 멤버를 하나 마련해둔다. 첫번째 방식 //public static final 필드 방식의 싱글턴 public class Elvis { public static final Elvis INSTANCE = new Elvis(); private Elvis(){...}; } private 생성자는 public static final 필드인 Elvis.INSTANCE를 초기화할 때 딱 한번만 호출된다. public 이나 protected(같은..
생성자에 매개변수가 많다면 빌더를 고려하라 점층적 생성자 패턴 생성자를 매개변수 개수에 따라 계속적으로 추가하는 패턴을 말함 이 클래스의 인스턴스를 만드려면 원하는 매개변수를 모두 포함하는 생성자 중 가장 짧은 것을 골라 호출하면 되는데, 클라이언트 입장에서 매개 변수로 불필요한 변수를 삽입할 때 헷갈릴 수 있다, 결국, 클라이언트가 실수로 매개변수의 순서를 바꾸어 값이 들어오면 런타임 에러가 발생할 수 있다. 이런 단점을 해결하기 위해 자바빈즈 패턴을 활용한다. 자바빈즈 패턴 기본 생성자만을 만들고 매개변수로 필요한 값들은 set메서드를 활용해서 객체를 완성하는 특징이다. 하지만 자바빈즈 패턴에서는 객체 하나를 만들려면 메서드를 여러 개 호출해야하고, 객체가 완전히 생성되기 전까지는 일관성이 무너진 상..
- Total
- Today
- Yesterday
- 연관관계
- 생성자
- 이펙티브 자바
- 스프링부트
- try catch finally
- flatMap
- springboot
- try with resources
- 김영한
- Spring
- junit
- 빌더 패턴
- jdk버전
- @Lazy
- package-private
- effectivejava
- Effective Java
- 인프런
- 점층적 생성 패턴
- 복사 팩토리
- java8
- java
- 팩토리 메소드 패턴
- 정적팩터리메서드
- ifPresent
- 자바8
- 이펙티브자바
- 빈 순환 참조
- JPA
- mustache
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |