Programming
스프링은 api요청, 응답에서 발생하는 예외들을 간편하게 처리할 수 있는 애너테이션을 지원한다. 예제로 쓰이는 패키지의 구조는 다음과 같다. @ExceptionHandler @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface ExceptionHandler { /** * Exceptions handled by the annotated method. If empty, will default to any * exceptions listed in the method argument list. */ Class
Spring MVC 스프링의 웹 계층을 담당하는 모듈 중에 서블릿 API를 기반으로 클라이언트의 요청을 처리하는 모듈을 spring-webmvc라고 하고 MVC는 각각 Model, View, Controller에 해당한다. Model Spring mvc 기반의 웹 애플리케이션이 클라이언트의 요청을 전달받고 요청 사항을 처리하기 위한 작업을 하는데, 처리하고 클라이언트에게 응답으로 돌려주는 데이터 View Model 데이터를 이용해서 클라이언트 애플리케이션의 화면에 보여지는 리소스를 제공 HTML HTML 페이지에 Model 데이터를 채우고 렌더링 해서 전송 ex) Thymeleaf, FreeMarker,... PDF, Excel Model 데이터를 가공해서 PDF나 Excel 문서를 클라이언트에 전송 X..
스프링 컨테이너에서 관리하는 스프링 빈들의 의존관계를 주입하는 방법은 크게 네 가지가 있다. 생성자 주입 (Constructor Injection) 수정자 주입(Setter Injection) 필드 주입 (field Injection) 일반 메서드 주입 1. 생성자 주입 이름처럼 생성자를 통해 의존 관계를 주입하는 방법 생성자 호출 시점에 딱 1번만 호출되는 것이 보장되기 때문에 불편, 필수 의존관계에 사용된다. @Component public class OrderServiceImpl implements OrderService { private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; @Aut..
스프링 빈을 등록하기 위한 방법은 두 가지가 있다. 1. 설정 정보 클래스의 메서드 레벨에 @Bean 사용하기. -> 몇 개 안 되는 스프링 빈을 등록할 땐 괜찮지만, 많은 빈을 등록하게 되면 귀찮고 누락 문제가 발생할 수 있다. 2. ComponentScan 사용하기 ComponentScan @ComponentScan 애너테이션은 @Component 애너테이션이 붙어 있는 클래스를 스캔해서 자동으로 스프링 빈으로 등록해준다. @Configuration 애너테이션이 붙은 설정 정보도 자동으로 등록하는데, @Configuration 애너테이션에도 @Component 애너테이션이 달려있기 때문이다. 이외에도 @Controller, @Service, @Repository를 찾아서 빈으로 등록해준다. @Targ..
싱글톤 (Singleton) 패턴 싱글톤 패턴이란 애플리케이션 내에서 사용하는 객체의 인스턴스를 하나만 공유해서 사용하는 패턴이다. public class AppConfig { public MemberService memberService() { return new MemberServiceImpl(memberRepository()); } public MemberRepository memberRepository() { return new MemoryMemberRepository(); } public OrderService orderService() { return new OrderServiceImpl(memberRepository(),discountPolicy()); } public DiscountPoli..
제어의 역전 IoC (Inversion of Control) 제어의 역전 (IoC)은 애플리케이션 흐름의 주도권이 뒤바뀌는 것을 뜻한다. public interface MemberService { void join(Member member); Member findMember(Long memberId); } public class MemberServiceImpl implements MemberService { private final MemberRepository memberRepository = new MemoryMemberRepository(); // } public interface MemberRepository { void save(Member member); Member findById(Long ..
SOLID 5원칙 - 좋은 객체 지향 설계의 5가지 원칙 SOLID란 로버트 마틴이 2000년대 초반에 명명한 객체 지향 프로그래밍 및 설계의 다섯 가지 기본 원칙을 마이클 페더스가 두문자어 기억술로 소개한 것이다. 프로그래머가 시간이 지나도 유지 보수와 확장이 쉬운 시스템을 만들고자 할 때 이 원칙들을 함께 적용할 수 있다. SOLID 원칙들은 소프트웨어 작업에서 프로그래머가 소스 코드가 읽기 쉽고 확장하기 쉽게 될 때까지 소프트웨어 소스 코드를 리팩터링 하여 코드 냄새를 제거하기 위해 적용할 수 있는 지침이다. 이 원칙들은 애자일 소프트웨어 개발과 적응적 소프트웨어 개발의 전반적 전략의 일부다. - 위키 백과 SRP : 단일 책임 원칙 (Single Responsibility Principle) OC..
스트림 자바 8 전까지 많은 데이터를 다룰 때 컬렉션이나 배열에 데이터를 담고 for문, Iterator를 사용했다. 이러한 방법들은 코드의 가독성이 떨어지고 데이터 소스들을 각각 다른 방법으로 다뤄야 한다. 다양한 데이터 소스들을 스트림으로 만들기만 하면 표준화된 방법으로 작업을 할 수 있게 해주는 것이 스트림이다. 스트림의 특징 1. 스트림은 읽기 전용이다. (원본 데이터를 변경하지 않는다.) public class StreamTest { public static void main(String[] args) { List list = Arrays.asList(4, 1, 5, 3, 2); List sorted = list.stream().sorted().collect(Collectors.toList())..
람다식 람다식은 함수를 간단한 식(expression)으로 표현하고 람다식을 익명 함수(anonymous function)이라고도 한다. int max(int a, int b){ return a > b ? a : b; } 일반적으로 정의해서 사용하는 함수는 위와 같다. 함수를 람다식으로 간단하게 표현할 수 있고 그 덕분에 가독성이 높아지고 생산성이 높아진다. (a, b) -> a > b ? a : b 람다식으로 표현하기 앞에서 본 max 함수를 람다식으로 표현하는 방법을 알아보자 1. 메서드 이름과 반환 타입을 제거하고 '->'를 {} 앞에 추가한다. (int a, int b) -> { return a > b ? a : b; } 2. return 값이 있는 경우 return을 생략하여 식으로 표현할 수 ..