성실한 사람이 되자

성실하게 글쓰자

This is spear

분류 전체보기 112

SPRING - 스프링 빈 중복 등록과 충돌에 대처하는 방법

중복 등록이 되는 상황 자동 빈 등록 vs 자동 빈 등록 수동 빈 등록 vs 자동 빈 등록 1. 자동으로 등록한 빈들끼리 충돌하는 경우 컴포넌트 새킨에 의해 자동으로 스프링 빈이 등록 되는데, 이름이 같은 경우 ConflictingBeanDefinitionException 예외라는 오류를 발생시킨다. 2. 자동으로 등록한 빈과 수동으로 등록한 빈이 충돌하는 경우 이 경우 수동 등록 빈이 우선권을 가진다는 점을 알아야 한다. (수동 빈이 자동 빈을 오버라이딩 해버린다.) 스프링은 친절하게 수동 빈이 자동 빈을 오버라이드시 남는 로그를 남겨준다. 이러한 경우는 개발자가 의도적으로 설정해서 나오는 경우가 아니라 설정들이 꼬여서 이런 결과가 나오는 경우가 대부분이다. 그러면 정말 잡기 어려운 버그가 만들어진다...

JAVA_SPRING 2021.12.28

SPRING - 다양한 방법으로 의존관계 주입하는 방법

@Autowired 의존관계 자동 주입 생성자에 @Autowired 애너테이션을 지정하면 스프링 컨테이너가 자동으로 해당 스프링 빈을 찾아 주입한다. 생성자에서 주는 인자의 해당 타입을 뒤져서 가져온다. 이름은 달라도 같은 타입이 여러개 있으면 충돌이 일어난다. 다양한 방법으로 의존관계 주입하는 방법 오류가 나지 않도록, 누군가 외부에서 실수로 주입하면 컴파일 에러가 나도록 외부에서 주입할 수 없도록 설계해야 한다. 1. 생성자 주입 생성자 호출 시점에서 딱 한번만 호출되는 것이 보장된다. 불변,필수(final) 의존관계에 사용 안에 데이터를 임의로 넣지 못하도록 설계해야 한다. (불변) final을 붙이면 값이 꼭 있어야 한다고 지정하는 것이다. (필수) 생성자가 딱 하나만 있으면 @Autowired ..

JAVA_SPRING 2021.12.28

SPRING - @ComponentScan

@Configuration 애너테이션을 사용한 구성 정보에 데이터를 다 넣으면 안되나? 스프링 빈이 너무 많아지면 설정 정보도 커지고 누락하는 문제도 발생한다. 그래서 스프링은 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔이라는 기능을 제공한다. 또, 의존관계도 자동으로 주입하는 ‘@Autowired’ 애너테이션이라는 기능도 제공한다. 코드로 @ComponentScan 애너테이션과 의존관계 자동 주입을 알아보자 @ComponentScan 애너테이션에 등록되는 스프링 이름은 어떻게 저장될까? @ComponentScan 애너테이션은 @Component 애너테이션이 붙은 모든 클래스를 스프링 빈으로 등록한다. 이 때, 빈의 기본 이름은 클래스명을 사용하되 맨 앞글자만 소문자를 사용한다. 빈 ..

JAVA_SPRING 2021.12.28

SPRING - 스프링 빈

자바 빈즈 자바 빈즈는 클래스안에 프로퍼티를 저장한 후 객체를 만들기 위한 클래스이다. 즉, 객체를 만들기 위한 틀인 클래스를 자바빈이라고 부르는 것처럼 보였다. 자바빈에 대해 공부를 하면서 자바 빈이랑 스프링 빈은 같을까 라는 의문이 생겼다. 스프링 빈이란 간단하게 말하자면 Spring에서의 빈은 ApplicationContext가 알고있는 객체, 즉 스프링 컨테이너 안에 담고있는 객체를 의미한다. 스프링 빈을 사용하면 스프링이 스프링 컨테이너 안에 해당 구현체를 관리하며, 구현체가 호출이 될 때, 참조하는 레퍼런스를 외부에서 주입해주는 역할이다. 스프링 IoC 컨테이너가 관리하는 자바 객체인 스프링 빈이랑 위에 설명하는 자바 빈즈는 같을까? 자바 빈즈와 유사하지만 다르다는 생각한다. 스프링 빈은 스프..

JAVA_SPRING 2021.12.28

SPRING - 스프링 컨테이너와 싱글톤 패턴

싱글톤 패턴 클래스의 인스턴스가 딱 하나만 생성되도록 하는 것을 보장하는 패턴이며, 객체 인스턴스를 2개 이상 생성하지 못하도록 막는다. pirvate 생성자를 사용해 외부에서 임의로 new 키워드를 사용하지 못하도록 막아야 한다. 싱글턴 패턴을 만드는 방법은 어떤 방법들이 있을까? 싱글턴 패턴을 적용하면 고객의 요청이 올 때 마다 객체를 생성하는 것이 아니라,이미 만들어진 객체를 공유해서 효율적으로 사용할 수 있다. 하지만, 싱글톤 패턴은 다음과 같은 수 많은 문제점들을 가지고 있다. 싱글톤 패턴의 문제점 구체 클래스에서 구현한 getInstance() 메서드를 호출해야 하기 때문에, 구체 클래스를 호출할 수 밖에 없다. 싱글톤 패턴을 구현하는 코드 자체가 많이 들어간다. 의존관계상 클라이언트가 구체 ..

JAVA_SPRING 2021.12.28

SPRING - 스프링을 이용해 의존성 주입하는 방법

자바를 이용해 외부에서 의존성 주입을 할 수 있는데 왜 스프링을 사용하는가? 스프링은 객체 지향 언어의 특징을 잘 살려내 애플리케이션을 개발할 수 있도록 도와주는 프레임워크이다. 외부에서 의존성을 주입하는 역할을 하는 클래스를 스프링 컨테이너에 등록하지 않고도 사용할 수 있도록 만들었기에 처음에는 굳이 스프링 컨테이너에 등록하기 위해 여러 어노테이션을 붙여가며 스프링 빈을 만들어야 할까 라는 생각을 많이 했다. 처음 만든 AppConfig 클래스 만으로 외부에서 의존성 주입해 객체 지향 설계를 할 수 있지 않을까라는 생각을 했고, AppConfig 클래스에 존재하는 DI 컨테이너들을 스프링 컨테이너에 등록하는 이유가 궁금했다. 그 궁금증에 답은 스프링 컨테이너를 이용해 스프링 빈을 관리하면 동시성 문제를..

JAVA_SPRING 2021.12.28

SPRING - 스프링 프레임워크 없이 SOLID 원칙들을 잘 지킬 수 있을까?

본론부터 말하자면 외부에서 의존 관계를 설정해준다면 해결할 수 있다고 생각한다. 웹 MVC 패턴을 이용해 각 구현체들은 의존 관계를 설정한 클래스에 의해 외부에서 참조 객체들을 선택받아 생성한다. 그렇게 되면 해당 구현 객체를 수정하지 않고도 참조 객체를 마음대로 교체할 수 있다. 스프링 프레임워크의 DI 컨테이너를 사용하지 않는다면 스프링 프레임워크에서 DI 컨테이너를 이용하지 않고 순수한 자바 코드로만 의존성 주입을 하게 된다면 의존성 주입을 요청할 때마다 객체를 생성한다. 만약 이렇게 된다면 각기 다른 클래스에서 부른 구현체가 달라 동시성 문제가 생길 수 있다. 객체 지향 프로그래밍을 더 잘하는 방법은 무엇일까 구현보다 역할을 더 중요하게 생각하자 SOLID 원칙을 지키며 설계하자 구현 객체에 대한..

JAVA_SPRING 2021.12.28

SPRING - 객체 지향 원리를 적용해 프로그래밍하는 방법

객체 지향의 특징 추상화 불필요한 정보는 숨기고 중요한 정보만을 표현하며 공통의 속성이나 기능을 묶는 것을 말한다. 캡슐화 기능과 특성의 모음을 클래스라는 캡슐에 분류해서 넣는 것이다. 상속 부모의 속성과 기능을 그대로 이어받아 사용할 수 있게 도와주고 기능의 일부분을 변경해 자식이 사용할 수 있도록 하는 것을 말한다. 다형성 하나의 객체나 변수가 상황에 따라 다른 의미로 해석될 수 있는 것이다. 다형성을 왜 사용할까? 인터페이스와 구현객체를 이용해 애플리케이션을 설계하면 클라이언트는 사용하려는 기능의 명세서만 보고도 사용할 수 있고, 상세 구현한 클래스의 내용을 알지 않아도 된다. 제일 중요한 강점은 구현 대상인 클래스의 내용을 변경해도 영향을 받지 않아 유연하게 구현체인 클래스를 변경할 수 있다.

JAVA_SPRING 2021.12.28

SPRING - 스프링이 어떻게 세상에 나왔을까?

EJB EJB는 인스턴스 풀링을 이용해 객체들을 미리 메모리에 저장해 많은 동접자수에 대해 안정성을 지원하고 자동으로 컨테이너가 모든 처리 메서드에 트랜잭션을 처리해준다. 그리고 빈즈의 상태를 사용여부에 따라 메모리에 저장할지 안할지를 고민하는 퍼시스턴스 관리를 할 수 있다. 그에 반해 단점은 복잡하고, 특정 환경에 종속적인 코드이며, 컨테이너 안에서만 동작할 수 있는 객체 구조라는 점이다. 무엇보다도 비즈니스 로직과 시스템 서비스에서도 트랜잭션 처리하는 프로그램이 필요하기 때문에 개발 생산성이 매우 떨어진다. POJO POJO를 해석하면 순수한 자바 오브젝트이다. 말 그대로 순수한 자바 오브젝트에 도메인 로직을 넣어 사용해 보자는 생각에서 나온 방법이다. 스프링 스프링은 복잡하고 컨테이너 안에서만 동작..

JAVA_SPRING 2021.12.28

SPRING - 스프링 기본 원리 정리

스프링 기본편 공부를 마치며 정리한 글 스프링이 무엇인지, 왜 세상에 나왔는 지 스프링 복잡하고 컨테이너 안에서만 동작할 수 있는 객체 구조인 EJB 컨테이너를 대체하기 위해 나온 기술이다. 스프링은 객체 지향 언어의 특징을 살려내 애플리케이션을 개발할 수 있도록 도와주는 프레임워크이다. 스프링 프레임워크의 핵심 기술은 스프링 DI 컨테이너와 AOP, 이벤트 등이 있고, 웹 기술은 스프링 MVC 스프링 WebFlux 가 있다. EJB EJB는 인스턴스 풀링을 이용해 객체들을 미리 메모리에 저장해 많은 동접자수에 대해 안정성을 지원하고 자동으로 컨테이너가 모든 처리 메서드에 트랜잭션을 처리해준다. 그리고 빈즈의 상태를 사용여부에 따라 메모리에 저장할지 안할지를 고민하는 퍼시스턴스 관리를 할 수 있다. 그에..

JAVA_SPRING 2021.12.28