목록Java, Spring (14)
당니의 개발자 스토리
객체는 언제 생성되고 언제 사라질까 Spring을 사용하다 보면 Bean이라는 개념을 계속 보게 된다.Bean은 단순하게 Spring이 관리하는 객체 이다. 그런데 이 Bean은 그냥 만들어졌다가 끝나는 게 아니다.생성되는 순간부터 사라질 때까지 일정한 흐름을 가진다.이걸 Bean의 생명주기라고 한다. 생명주기는 아래와 같다.객체 생성→ 의존성 주입→ 초기화 메서드→ 사용→ 소멸 메서드 이제 하나씩 이해해보자!!! 가장 먼저 객체가 생성된다.new 객체()Spring이 Container 안에서 Bean 객체를 만든다. 그 다음 의존성 주입이 일어난다.예를 들어 이런 코드가 있다고 하자.@Componentpublic class WasherUser { private final Washer washer;..
getBean으로 Bean을 꺼낼 때,만약 같은 타입 Bean이 여러 개 있다면 어떻게 해결할까? Spring에서 DI를 쓰다 보면 자연스럽게 @Autowired를 사용하게 된다. @Autowired는 필요한 Bean을 자동으로 넣어주는 애노테이션이다.예를 들어 이런 코드가 있다고 해보자.@Servicepublic class WasherUser { private final Washer washer; public WasherUser(Washer washer) { this.washer = washer; }}여기서 Washer 타입 Bean을 Spring이 찾아서 자동으로 넣어준다. 이걸 조금 더 풀어서 보면 이렇게 동작한다.1. Washer 타입을 찾는다2. Container에서..
묵시적 DI와 명시적 DI는 어떻게 다를까 Spring에서 DI를 배우다 보면 자연스럽게 두 가지 방식이 등장한다.@Component@Bean처음 보면 둘 다 Bean 등록인데 뭐가 다른지 헷갈린다.이 글에서는 이 두 개를 정확하게 구분한다. 먼저 결론부터 보면 이렇게 정리된다.@Component → 자동 등록 (묵시적 DI)@Bean → 직접 등록 (명시적 DI)이제 하나씩 이해해보자.먼저 @Component부터 보자.@Componentpublic class SWasher implements Washer {}이렇게 작성하면 Spring은 이 클래스를 자동으로 Bean으로 등록한다.이게 가능한 이유는 ComponentScan 때문이다. Spring은 실행될 때 특정 패키지를 스캔하면서 @Component..
Java로 프로그램을 만들다 보면 자연스럽게 객체를 생성하게 된다. 예를 들어 이런 코드가 있다고 해보자.public class WasherUser { private SWasher washer = new SWasher(); public void wash(){ washer.wash(); }}겉으로 보면 문제 없어 보인다.하지만 이 코드는 심각한 문제를 가지고 있다...!! 바로 강한 결합이다. 이 코드는 WasherUser가 SWasher에 강하게 묶여 있는 구조다.왜냐하면 코드 안에 이렇게 박혀 있기 때문이다.new SWasher()즉 WasherUser는 이렇게 말하는 것과 같다.나는 무조건 SWasher만 쓸 거야문제는 나중에 세탁기를 바꾸고 싶을 때 발생한다. class..
Spring 프로젝트를 하다 보면 Maven을 같이 사용하게 된다. 그래서 처음에는 Maven도 Spring처럼 프레임워크인가? 라는 생각이 들 수 있다.하지만 Maven은 애플리케이션의 흐름을 제어하지 않는다. Maven은 프로젝트를 빌드하고, 필요한 라이브러리를 관리해주는 도구다.Maven은 무엇을 하는 도구일까?Maven은 크게 두 가지 역할을 한다. 첫 번째는 빌드 자동화다.코드를 컴파일하고, 테스트를 실행하고, 결과물을 만드는 과정을 자동으로 처리해준다. 두 번째는 의존성 관리다.프로젝트에 필요한 라이브러리를 자동으로 다운로드하고 관리해준다.pom.xml이란?Maven 프로젝트를 보면 pom.xml이라는 파일이 있다.이 파일은 프로젝트 설정 파일이다.여기에서 어떤 라이브러리를 사용할지, 어떻게 ..
Spring으로 개발을 하다 보면 자연스럽게 테스트 코드를 작성하게 된다.처음에는 그냥 실행해서 확인하면 되지 않나 싶지만,프로젝트가 커질수록 코드가 제대로 동작하는지 자동으로 검증하는 과정이 필요해진다. 이때 사용하는 것이 JUnit이다.JUnit이란?JUnit은 자바에서 테스트 코드를 작성하고 실행하기 위한 라이브러리다.쉽게 말하면 '코드가 제대로 동작하는지 자동으로 확인해주는 도구' 라고 보면 된다. 예를 들어 어떤 메서드가 있다고 해보자.public int add(int a, int b) { return a + b;}이 메서드가 제대로 동작하는지 확인하려면 직접 실행해보면 된다.하지만 사람이 확인하면 매번 확인해야 해서 귀찮고, 또 실수할 수도 있다. 그래서 테스트 코드를 따로 작성한다.@T..
Spring에서 DI를 배우고 나면 자연스럽게 이런 생각이 든다."객체를 외부에서 넣어준다는 건 알겠어.근데 대체 누가 객체를 만들고 관리하는 거지?"여기서 등장하는 개념이 Spring Bean과 Spring Container다.Spring에서는 객체를 개발자가 계속 직접 new로 만드는 방식보다, Spring이 객체를 생성하고 관리하도록 맡기는 방식을 많이 사용한다.그리고 Spring이 관리하는 객체를 Bean이라고 부른다.이 구조를 이해하면 왜 Spring에서 @Component, @Service, @Repository, @Autowired 같은 어노테이션을 사용하는지도 자연스럽게 연결된다.Spring Container란?Spring Container는 Spring이 객체를 생성하고 관리하는 공간이..
Spring을 공부하다 보면 DI, AOP, PSA, POJO라는 단어가 계속 나온다.처음 보면 당황스럽고 이해하기가 어렵다.. Spring은 개발자가 평범한 자바 객체로 비즈니스 로직을 작성하게 하고,객체 사이의 관계를 알아서 연결해주고,반복되는 공통 기능은 따로 분리해주고,기술이 바뀌어도 코드를 크게 흔들리지 않게 도와준다. 이 흐름을 만드는 개념이 DI, AOP, PSA, POJO다. 이제 하나씩 알아보자!!DI란?DI는 Dependency Injection의 약자다.즉, 의존성 주입이라고 한다. 여기서 먼저 의존성이라는 말을 이해해야 한다.의존성이란 어떤 객체가 다른 객체 없이는 동작할 수 없는 관계를 말한다. 예를 들어 자동차는 엔진이 있어야 움직일 수 있다.그러면 자동차는 엔진에 의존한다고 볼..