728x90
반응형
SMALL

분류 전체보기 217

스프링에서 의존관계 자동 주입하는 방법들

우선 DI가 무엇인지 어떤 장점이 있는지 왜 스프링에서 핵심 중 하나인지는 이해했다.그럼 스프링에서 이 의존관계를 주입하는 방법에 대해서 알아보려고 하는데 다음과 같은 방법들이 있다.생성자 주입setter 주입필드 주입일반 메서드 주입생성자 주입생성자를 통해서 주입하는 방법이다. 가장 중요하고 가장 많이 사용되며 가장 안전한 주입 방식이다. OrderServiceImpl@Componentpublic class OrderServiceImpl implements OrderService { private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; @Autowired public..

@ComponentScan

스프링을 사용할 때 스프링 빈으로 등록하는 가장 편리한 방법은 컴포넌트 스캔이다.스프링 빈으로 등록하고 싶은 타입(클래스, 인터페이스)에 그저 `@Service`, `@Controller`, `@Repository`, `@Component` 이런 애노테이션을 붙이기만 하면 스프링이 자동으로 빈으로 등록해주기 때문에. 근데, 스프링에 용빼는 재주가 있는게 아니다. 결국 스프링이 컴포넌트 스캔을 하기 위해선 어디서부터 컴포넌트 스캔을 하고 어떤것들을 제외하고 등등의 설정을 다 해줘야한다. 그리고 그것을 이 `@ComponentScan`이라는 애노테이션으로 간단하게 할 수 있다. 그리고 이건? 컴포넌트 스캔을 위해 필수적으로 필요한 애노테이션이다.  "네? 저는 스프링부트에서 저 애노테이션 안쓰고도 잘 되던데..

스프링 빈은 무상태로 설계해야 한다 ❗️

정답은 아닌데 개인적으로 맞다고 본다. 스프링은 기본적으로 스프링 빈을 싱글톤으로 등록한다.싱글톤이 안티패턴이라고까지 불릴 정도로 싱글톤은 여러 문제점이 있는데 스프링은 그 문제들을 전부 해결해준 상태로 싱글톤으로 등록해준다. 싱글톤의 문제점싱글톤을 만들어내야 하는 코드 자체가 번거롭다.의존관계상 클라이언트가 구체 클래스에 의존한다. (싱글톤클래스.getInstance())구체 클래스에 의존한다는것은 DIP(의존관계 역전 법칙)를 위반한다는 뜻이고 그 뜻은 OCP원칙을 위반할 가능성이 높다.테스트하기 어렵다자식 클래스를 만들기 어렵거나 불가능하다 싱글톤은 패턴이든, 스프링 같은 싱글톤 컨테이너를 사용하든 인스턴스가 하나이고 그걸 공유하는 방식이라면 상태를 유지하게 설계하면 안된다.  무상태로 설계하거나,..

SOLID - 좋은 객체 지향 설계의 5가지 원칙

클린코드로 유명한 로버트 마틴이 좋은 객체 지향 설계의 5가지 원칙을 정리했다.SRP: 단일 책임 원칙 (Single Responsibility Principle)OCP: 확장에는 열려있고 변경에는 닫혀있는 원칙 (Open/Closed Principle)LSP: 리스코프 치환 원칙 (Liskov Substitution Principle)ISP: 인터페이스 분리 원칙 (Interface Segregation Principle)DIP: 의존관계 역전 원칙 (Dependency Inversion Principle)하나씩 알아보자. SRP (Single Responsibility Principle)단일 책임 원칙이라는 뜻의 SRP. 무슨 말일까? 한 클래스는 하나의 책임만 가져야 한다.하나의 책임이라는 것은 모..

컬렉션 프레임워크 - 정렬 (Comparable, Comparator)

참고자료: 김영한의 실전 자바 - 중급 2편 | 김영한 - 인프런김영한 | 자바 제네릭과 컬렉션 프레임워크를 실무 중심으로 깊이있게 학습합니다. 자료 구조에 대한 기본기도 함께 학습합니다., 국내 개발 분야 누적 수강생 1위, 제대로 만든 김영한의 실전www.inflearn.com 정렬자료 구조에 저장된 데이터를 정렬하는 방법을 알아보자.바로 예제를 살펴보자. SortMain1package org.example.collection.compare;import java.util.Arrays;import java.util.Comparator;public class SortMain1 { public static void main(String[] args) { Integer[] array = {..

컬렉션 프레임워크 - 순회 (Iterable, Iterator)

참고자료: 김영한의 실전 자바 - 중급 2편 | 김영한 - 인프런김영한 | 자바 제네릭과 컬렉션 프레임워크를 실무 중심으로 깊이있게 학습합니다. 자료 구조에 대한 기본기도 함께 학습합니다., 국내 개발 분야 누적 수강생 1위, 제대로 만든 김영한의 실전www.inflearn.com 순회우선, Iterable, Iterator를 다루기 앞서 자료 구조를 순회한다는 것에 대해 이해해보자.순회라는 것은 여러 곳을 돌아다닌다는 뜻이다. 자료 구조에서 순회는 자료 구조에 들어있는 데이터를 차례대로 접근해서 처리하는 것을 순회라고 한다. 그런데 다양한 자료구조가 있고, 각각의 자료 구조마다 데이터를 접근하는 방법이 전부 다르다. 예를 들어보자.배열의 경우 index를 size까지 차례대로 증가하면서 순회해야 하고,..

컬렉션 프레임워크 - Deque (Stack, Queue)

참고자료: 김영한의 실전 자바 - 중급 2편 | 김영한 - 인프런김영한 | 자바 제네릭과 컬렉션 프레임워크를 실무 중심으로 깊이있게 학습합니다. 자료 구조에 대한 기본기도 함께 학습합니다., 국내 개발 분야 누적 수강생 1위, 제대로 만든 김영한의 실전www.inflearn.com 이제 Deque라는 자료구조를 알아보자. 왜 Stack, Queue를 Deque로 사용할 수 있을까? 우선, Deque는 "Double Ended Queue"의 약자로 이름에서 알 수 있듯 양쪽 끝에서 요소를 추가하거나 제거할 수 있다. 그래서 큐와 스택의 기능을 모두 포함하고 있어 매우 유연한 자료구조이다. 보통 '덱'이라고 많이 불린다. Deque의 구조 Queue에서는 전통적으로 넣을 때 `offer` 라는 단어를 사용하..

컬렉션 프레임워크 - Map

참고자료: 김영한의 실전 자바 - 중급 2편 | 김영한 - 인프런김영한 | 자바 제네릭과 컬렉션 프레임워크를 실무 중심으로 깊이있게 학습합니다. 자료 구조에 대한 기본기도 함께 학습합니다., 국내 개발 분야 누적 수강생 1위, 제대로 만든 김영한의 실전www.inflearn.com MapMap은 키-값 쌍을 저장하는 자료구조이다. 여기서 특징이 있다.`키`는 맵 내에서 유일해야 한다. 그리고 키를 통해 값을 빠르게 검색할 수 있다.`키`는 중복될 수 없지만 `값`은 중복될 수 있다.Map은 순서를 유지하지 않는다. 키는 맵 내에서 유일하다는 것은 중복이 불가능하단 얘기고 이 말이 꼭 Set과 유사하다. 맞다. Map의 키는 Set으로 이루어져 있다. 그래서 Map의 모든 키 목록을 조회하는 keySet(..

컬렉션 프레임워크 - Set 직접 구현해보기 (hash, hashCode()에 대해)

참고자료: 김영한의 실전 자바 - 중급 2편 | 김영한 - 인프런김영한 | 자바 제네릭과 컬렉션 프레임워크를 실무 중심으로 깊이있게 학습합니다. 자료 구조에 대한 기본기도 함께 학습합니다., 국내 개발 분야 누적 수강생 1위, 제대로 만든 김영한의 실전www.inflearn.com Set을 직접 구현해 보기 전 먼저 List와 Set은 어떤 차이가 있는지 알아보자.List순서가 보장된다. 넣는 순서대로 저장된다.중복을 허용한다.Set순서가 보장되지 않는다.중복을 허용하지 않는다.Set은 중복된 값을 방지할 수 있는 좋은 자료구조이다. 그리고 해당 값이 있는지 빠르게 찾아낼 수 있는 방법을 가지고 있다.어떻게 중복을 방지하고 값의 존재 유무를 빠르게 알아낼 수 있는지 직접 구현해 보면서 알아보자. 우선 가..

컬렉션 프레임워크 - List 인터페이스

참고자료: 김영한의 실전 자바 - 중급 2편 | 김영한 - 인프런김영한 | 자바 제네릭과 컬렉션 프레임워크를 실무 중심으로 깊이있게 학습합니다. 자료 구조에 대한 기본기도 함께 학습합니다., 국내 개발 분야 누적 수강생 1위, 제대로 만든 김영한의 실전www.inflearn.com ArrayList, LinkedList를 직접 구현해봤더니 공통적으로 사용되는 메서드가 있고 이를 추상화한게 List라는 인터페이스라는 것을 깨달았다. 그래서 항상 사용하길 다음과 같이 사용했구나를 알게됐다.List list = new ArrayList(); 한번 List도 직접 인터페이스를 만들고 지금까지 만든 ArrayList, LinkedList를 구현체로 변경해보자. MyListpackage org.example.col..

728x90
반응형
LIST