본문 바로가기

Spring

(12)
의존성 역전하기와 육각형 아키텍쳐 1) 단일 책임 원칙 - 일반적으로 단일 책임 원칙은 '하나의 컴포넌트는 오로지 한 가지 일만 해야 하고, 그것을 올바르게 수행해야 한다' 고 하지만, 이는 단일 책임 원칙의 실제 의도는 아닙니다. 단일 책임 원칙의 실제 정의는 '컴포넌트를 변경하는 이유는 오직 하나뿐이어야 한다' 는 것입니다. 즉, 단일 책임 원칙을 '단일 변경 이유 원칙'으로 바꿔야 할 수도 있습니다. - 만약 컴포넌트를 변경할 이유가 한 가지라면 우리가 어떤 다른 이유로 소프트웨어를 변경하더라도 이 컴포넌트에 대해서는 전혀 신경 쓸 필요가 없습니다. - 많은 코드는 단일 책임 원칙을 위반하기 때문에 시간이 갈수록 변경하기가 더 어려워지고, 그로 인해 변경 비용도 증가합니다. 시간이 갈수록 컴포넌트를 변경할 더 많은 이유가 쌓여갑니다..
롬복 어노테이션과 사용시 주의할 점 - 이 글에서는 대표적으로 많이 사용하는 롬복 어노테이션과 사용 시 주의할 점을 알아보겠습니다. 1) 롬복 어노테이션 (1) @Builder - @Builder는 클래스를 위한 복잡한 빌더 API를 만듭니다. @Builder는 예를 들어, 다음과 같은 코드를 만들어줍니다. Person.builder() .name("Adam Savage") .city("San Francisco") .job("Mythbusters") .job("Unchained Reaction") .build(); - @Builder는 클래스, 생성자 혹은 메소드 레벨에 위치할 수 있습니다. 일반적으로는 생성자 혹은 메소드 레벨에 위치합니다. (2) @AllArgsConstructor - @AllArgsConstructor는 모든 필드 값..
롬복 1) 롬복(lombok)이란? - 개발을 하면 대부분은 다 불변이고, 그래서 final 키워드를 주로 사용하게 됩니다. 그런데 생성자나 주입 받은 값을 대입하는 코드를 일일이 만들어야 해서 번거롭습니다. 이 때, 필드 주입처럼 편리하게 사용할 수 있는 방법이 있는데, 그것이 바로 롬복(lombok)입니다. - 그렇다면 롬복을 적용하기 전과 후에 어떻게 코드가 바뀌는지 예시 코드를 통해 살펴보겠습니다. [롬복을 적용하기 전] @Component public class OrderServiceImpl implements OrderService{ private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy;..
의존관계 자동 주입 1) 의존 관계 주입 - 의존 관계 주입 방법에는 크게 4가지 방법이 있습니다. (1) 생성자 주입 (2) 수정자(setter) 주입 (3) 필드 주입 (4) 일반 메서드 주입 (1) 생성자 주입 - 생성자 주입은 이름 그대로 생성자를 통해서 의존 관계를 주입 받는 방법입니다 생성자 주입은 생성자 호출 시점에 딱 1번만 호출되는 것이 보장되며, 불변, 필수 의존관계에 사용됩니다. @Component public class OrderServiceImpl implements OrderService{ private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; @Autowired public OrderS..
컴포넌트 스캔 - 스프링에서 객체를 스프링 컨테이너가 관리하도록 하려면 스프링 컨테이너에 등록되어야 합니다. 하지만 이러한 등록을 일일이 하는 것은 번거롭습니다. 따라서 스프링에서는 '컴포넌트 스캔'을 통해서 스프링 빈의 자동 등록을 지원합니다. 1) 컴포넌트 스캔이란? - 컴포넌트 스캔이란 말 그대로 '컴포넌트'를 '스캔'하는 것입니다. 스프링에서 스프링 빈으로 등록하고 싶은 클래스를 @Component를 표기하면, 컴포넌트 스캔을 통해 해당 클래스를 스프링 빈으로 등록합니다. 이 때, 컴포넌트 스캔을 수행하는 클래스는 @ComponentScan이 붙어야 합니다. package hello.core; import org.springframework.context.annotation.ComponentScan; impor..
웹 서버와 WAS 1) 웹 서버란? - 웹 서버의 특징은 다음과 같습니다. (1) HTTP를 기반으로 동작합니다. (2) 주로 정적 리소스를 제공하고, 기타 부가 기능을 제공합니다. -> 정적 리소스에는 HTML, CSS, JS, 이미지, 영상 등이 포함됩니다. (3) 대표적인 예에는 Nginx, Apache 등이 있습니다. 2) WAS(Web Application Server)란? - WAS의 특징은 다음과 같습니다. (1) HTTP를 기반으로 동작합니다. (2) 웹 서버의 기능을 대부분 포함하면서, 프로그램 코드를 실행해서 애플리케이션 로직을 수행합니다. (3) 서블릿, JSP, 스프링 MVC 등이 WAS에서 동작합니다. (4) 대표적인 예에는 Tomcat, Jetty, Undertow 등이 있습니다. 3) 웹 서버와..
스레드 풀 1) 클라이언트로부터의 다중 요청 - 서버 어플리케이션을 운영하다 보면 클라이언트로부터 다중 요청이 발생합니다. 자바는 기본적으로 멀티 스레드를 지원하므로, 다중 요청에 대해 여러 개의 스레드를 통해서 처리가 가능합니다. 이 때, 요청에 대해 응답하기 위한 스레드를 관리하는데는 2가지 방식이 있습니다. (1) 요청마다 스레드 생성 (2) 스레드 풀 2) 요청마다 스레드 생성 - 요청마다 스레드를 생성하는 것은 장단점이 있습니다. 장점 (1) 동시 요청을 처리할 수 있음 (2) 리소스(CPU, 메모리 등)가 허용하는 범위에서 처리할 수 있음 (3) 하나의 스레드가 지연되어도 나머지 스레드가 정상 동작함 단점 (1) 스레드는 생성 비용이 매우 비쌈 -> 고객의 요청이 올때마다 스레드를 생성하면, 응답 속도가..
싱글톤 컨테이너 1) 스프링 어플리케이션의 특징 - 스프링 어플리케이션은 보통 웹 어플리케이션이고, 많은 클라이언트의 요청을 한꺼번에 처리합니다. 그리고 이 클라이언트의 요청을 처리하기 위해서는 객체를 생성해야 합니다. 그런데 클라이언트의 요청이 많을 때, 각각의 요청마다 따로 객체를 생성하면 매우 많은 객체를 메모리에 생성해야 합니다. 그리고 그것은 메모리 낭비로 이어질 수 있습니다. 이와 같은 문제는 싱글톤 패턴을 활용해서 해결할 수 있습니다. 2) 싱글톤 패턴이란? - 싱글톤 패턴이란 클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴입니다. package hello.core.singleton; public class SingletonService{ private static final Singlet..
Spring 로깅 - 스프링 운영 시스템에서는 System.out.println()과 같은 시스템 콘솔을 통해서 정보를 출력하지 않고, 별도의 로깅 라이브러리를 사용합니다. 실무에서는 항상 로그를 사용해야 합니다. 이번 글에서는 스프링에서 사용하는 로깅 라이브러리에 대해 알아보겠습니다. 1) 로그 레벨과 로그 포맷(feat. Slf4j, Logback) - Slf4j는 스프링 로깅 기능을 제공하는 인터페이스입니다. Logback은 그 구현체인 로깅 라이브러리입니다. Slf4j를 활용한 예시 코드는 다음과 같습니다. import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.RestControlle..
서블릿 - 서블릿이란 클라이언트의 요청을 처리하고 응답을 반환하는 것을 지원하는 자바 객체입니다. 자바에서는 HttpServlet 이라는 추상 클래스를 통해서 서블릿 객체의 생성을 지원합니다. 코드 예시는 다음과 같습니다. @WebServlet(name="helloServlet", urlPatterns="/hello") public class HelloServlet extends HttpServlet { @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { super.service(request, response); } 서블릿 클래스는..