Spring
[Spring Basic] 빈의 생명주기와 스코프
[Spring Basic] 빈의 생명주기와 스코프
2022.08.09싱글톤 패턴에서 스프링 빈의 라이프사이클은 다음과 같다. 스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존관계 주입 -> 초기화 콜백 -> 객체 사용 -> 소멸 전 콜백 -> 종료 스프링 컨테이너가 초기화되는 시점에 스프링 빈이 생성되고, 이후 객체 초기화 과정에서 빈으로 등록된 객체들이 주입된다. 별도로 설정하지 않았으면 빈으로 관리되는 객체들은 싱글톤으로 관리되고 한 번 주입되 객체들이 공유돼서 사용된다. 내부 값을 조금 변경하는것과 같이 단순한 경우에는 생성자를 통해 두 작업을 함께 처리해도 괜찮지만, 일반적으로 초기화 작업은 메모리를 할당해 객체를 생성하는 작업보다 무거운 작업이기 때문에 분리되어야 한다. 여기서 초기화 콜백과 소멸 전 콜백이 낯선데, 각각 초기화 작업이 수행된 후 메서드를 호..
[Spring Basic] 의존관계 주입
[Spring Basic] 의존관계 주입
2022.08.081. 생성자를 통해 의존관계를 주입하는 경우는 지금까지 사용해 온 방법이고, 가장 많이 사용되는 방법이다. 생성자를 호출하는 시점에만 주입됨을 보장할 수 있고, 때문에 변하면 안 되는 요소와 값이 필수로 주입돼야 하는 요소에 사용한다. @Component를 찾고 빈으로 등록할 때 생성자를 호출하게 되기 때문에 빈의 등록과 의존관계의 주입이 함께 발생한다고 생각해도 좋다. 생성자가 하나만 존재할 경우 @Autowired 애너테이션을 생략해도 자동으로 주입된다. 2. 수정자를 통해 의존관계를 주입하는 경우는 두 번째로 많이 사용되는 방법이고, 변경될 가능성이 높고 선택적으로 주입받아도 괜찮은 요소에 사용한다. 생성자를 통해 의존관계를 주입하는 경우와 다르게 빈을 등록하는 작업과 의존관계가 주입되는 작업이 독..
[Spring Basic] Singleton
[Spring Basic] Singleton
2022.08.07클라이언트가 요청 할 때 마다 객체를 만들어서 반환하게 되면 메모리를 계속해서 낭비하게 되고, 심한 경우 서버가 터지는 경우도 발생한다. 공유해서 사용해도 괜찮은 객체는 하나만 생성하고 공유하도록 설계하는게 합리적이고, 이를 싱글톤 패턴이라고 부른다. 싱글톤 패턴을 사용하면 클래스의 인스턴스가 하나만 생성됨을 보장할 수 있다. public class SingletonService { private static final SingletonService instance = new SingletonService(); public static SingletonService getInstance(){ return instance; } private SingletonService(){ } public void lo..
[Spring Basic] 스프링과 IoC
[Spring Basic] 스프링과 IoC
2022.08.06AppConfig를 도입해 제어의 흐름을 가져왔다. 각각의 서비스들은 필요한 인터페이스를 호출하지만, 어떤 구현 객체들이 호출되는지는 모른다. 프레임워크와 라이브러리도 제어의 대상에 따라 구분할 수 있다. 프레임워크가 내가 작성한 코드를 제어하고 대신 실행하면 프레임워크라고 부르고, 반대로 내가 작성한 코드가 직접 제어의 흐름을 담당한다면 라이브러리라고 부른다. 프레임워크의 대표적인 예시로는 JUnit테스트가 있다. 정적인 클래스 의존 관계와 실행 시점에 결정되는 동적인 객체 의존 관계로 나눌 수 있다. 정적인 클래스 의존관계는 클래스에서 import하는 요소들만 보고 의존관계를 판단하는걸 의미한다. OrderServiceImpl은 MemberRepository와 DiscountPolicy에 의존함을 알..
[Spring Basic] JPA와 AOP
[Spring Basic] JPA와 AOP
2022.07.29JDBC나 JPA로 스프링과 데이터베이스를 연결한 후, 테스트를 진행해보자. @SpringBootTest @Transactional class MemberServiceIntTest { @Autowired MemberService memberService; @Autowired MemberRepository memberRepository; @Test public void 회원가입() throws Exception { //Given Member member = new Member(); member.setName("hello"); //When Long saveId = memberService.join(member); //Then Member findMember = memberRepository.findById(..
[Spring Basic] 동기와 비동기
[Spring Basic] 동기와 비동기
2022.07.15데이터를 주고받을 때 XML을 자주 사용했는데, XML은 사용하기 복잡하고 태그를 많이 사용해야 해서 XML보다 간단하게 사용할 수 있는 JSON 형식을 사용한다. JavaScript객체를 서버로 전송하려면 데이터를 전송하기 편한 형식으로 먼저 변환하는 직렬화 과정이 필요하고, 서버가 보낸 데이터를 JavaScript 객체로 변환할 때는 역직렬화가 수행된다. 자바와 자바스크립트간의 데이터 교환을 수행하려면 Jackson, stringify, parse 등 라이브러리와 내장 메서드를 사용해 직렬화와 역직렬화를 수행한다. 동기 방식은 작업을 순차적으로 처리하는 방식이고, 비동기 방식은 여러 작업을 동시에 처리하는 방식이다. 동기 방식은 한 번에 하나의 작업만 처리할 수 있다. 특정 작업이 수행중일 경우 다음..
[Spring Basic] MyBatis
[Spring Basic] MyBatis
2022.07.12MyBatis는 자바 코드와 SQL을 매핑해주는 프레임워크다. SQL문을 별도의 xml파일로 분리해 자바 코드에서 SQL을 직접 작성하지 않고 간편하게 작성할 수 있게 도와준다. MyBatis가 JDBC드라이버를 사용해 DB와 통신하고, Spring을 사용할 때는 MyBatis와 Spring을 연결해주는 mybatis-spring을 설치해 사용한다. MyBatis를 사용하기 전에는 SQL 구문을 자바의 String 객체에 직접 저장하고 SQL을 데이터베이스에 보내는 방식으로 데이터베이스와 통신했었지만, MyBatis가 도입된 이후부터는 xml에 SQL을 작성해 데이터베이스와 통신한다. MyBatis에서 SqlSession을 생성하려면 SqlSessionFactory 의 구현체가 필요하다. SqlSessi..
[Spring Basic] DAO Repository DTO VO Entity
[Spring Basic] DAO Repository DTO VO Entity
2022.07.09DAO, Repository 데이터에 접근하기 위한 객체를 DAO (Data Access Object) 라고 한다. DAO를 사용해 데이터베이스에 있는 테이블로부터 CRUD를 수행한다. 데이터베이스 테이블 하나당 하나의 DAO를 작성하고, Controller에서 DAO를 통해 데이터베이스를 다룬다. 컨트롤러에서 바로 데이터베이스에 접근하도록 할 수도 있지만, 이 경우 중복되는 메서드들이 많이 발생할 수 있다. 중복되는 내용을 DAO로 따로 정리해놓고, 컨트롤러가 DAO를 통해 데이터베이스에 접근하도록 하는 편이 합리적이다. 이를 계층의 분리라고 부르고 DAO는 Persistence Layer, 컨트롤러를 Presentation Layer라고 부른다. DAO 계층에서 데이터베이스 연결, 쿼리 실행, 등 데..
[Spring Basic] JUnit Test Framework
[Spring Basic] JUnit Test Framework
2022.07.09개발 방법론 중 TDD (Test-Driven Development) 는 애플리케이션에 기능을 추가하기 전에 기능이 작동하는 테스트케이스를 먼저 작성하고 테스트를 통과하는 소스코드를 작성하는 방식의 개발 방법을 의미한다. 테스트를 먼저 추가하는 방식으로 개발해 견고한 코드를 작성할 수 있고 이후 추가로 기능을 개발했을 때 이미 작성한 테스트를 실행시켜 새로 개발한 기능에 Side Effect가 없는지 검증할 수 있다. JUnit은 자바로 작성한 애플리케이션을 작은 단위로 나눠서 테스트 할 수 있게 해 주는 도구이다. 간단한 테스트는 자바로 비즈니스 로직 작성하듯 테스트 할 수 있지만 테스트 할 때 데이터베이스를 연동하고 여러 가지 무거운 객체들을 DI 받아야 하는 경우는 테스트를 가볍게 돌리기 위해 Mo..
[Spring Basic] 파라미터의 변환과 검증
[Spring Basic] 파라미터의 변환과 검증
2022.06.24위의 URL로 요청을 수행하면, 데이터는 Map 자료구조로 변환된다. 해당 Map을 컨트롤러가 파라미터에 있는 MyDate 객체로 묶어준다. 이 과정에서 WebDataBinder가 개입해 타입 변환과 데이터 검증 작업을 수행한다. WebDataBinder는 스프링 MVC가 제공하는 기능으로, HTTP 요청 파라미터를 자바 객체에 자동으로 바인딩하는 역할을 수행한다. WebDataBinder가 요청 파라미터를 자바 객체로 변환할 때는 내부적으로 PropertyEditor 또는 Converter 가 사용된다. PropertyEditor는 java.beans 패키지에 포함돼있고 문자열을 특정 타입의 객체로 변환하거나 객체를 문자열로 변환한다. Converter는 스프링에서 제공하는 인터페이스로 문자열을 객체로..
[Spring Basic] DispatcherServlet
[Spring Basic] DispatcherServlet
2022.06.23스프링 MVC의 디스패처 서블릿은 여러 개의 서블릿들에 대해 공통 부분을 따로 빼서 처리하는 역할을 수행한다. (프론트 컨트롤러) 클라이언트로부터 요청이 오면 우선 디스패처 서블릿이 요청을 받아 해당하는 컨트롤러의 메서드를 호출한 후 컨트롤러가 반환하는 뷰 이름을 받아오는 방식으로 진행된다. 이 과정에서 URL을 키, 메서드를 값으로 가지는 HandlerMapping과 HandlerAdapter가 사용된다. HandlerMapping은 디스패처 서블릿이 클라이언트로부터 받은 요청을 어떤 컨트롤러가 처리할 지 결정한다. HandlerAdapter는 HandlerMapping이 찾은 컨트롤러를 실행하고 그 결과를 적당한 객체로 변환한다. 요청이 왔을 때 디스패처 서블릿은 HandlerMapping에게 먼저 ..
[Spring Basic] 리다이렉트와 포워드
[Spring Basic] 리다이렉트와 포워드
2022.05.12Redirect 클라이언트가 요청을 했지만, 요청을 처리하는 jsp파일에서 요청을 처리할 수 없을 때 다른 URL으로 다시 요청한다. 브라우저는 자동으로 Redirection의 헤더에 담긴 정보를 읽고 요청을 보낸다. 처음 요청은 수동, 두 번째 요청은 자동으로 수행되고 리다이렉트로 요청될 때는 처음 요청이 어떤 방식임에 상관없이 GET방식으로 요청한다. 즉, 클라이언트가 요청을 보내고 서버는 클라이언트에게 새로운 위치로 이동하라고 응답하는 경우가 리다이렉트이다. (HTTP 300번) 원래의 요청과 새로운 요청은 독립적으로 구분된다. 사용자가 로그인 후 메인 페이지로 이동하는 경우 사용된다. Forward 클라이언트가 요청을 했지만 해당 jsp에서 전부 처리하지 못하고 다른 jsp를 호출하는 경우를 말한..