본문 바로가기

728x90
반응형

전체 글

(694)
싱글톤(Singleton) singleton 싱글톤은 유일한 1개의 공유 인스턴스만 관리하며, 해당 빈 정의와 일치하는 ID를 가진 모든 요청은 스프링 컨테이너에 의해 유일하게 "하나의 빈"만 반환합니다. 만약 싱글톤으로 1개의 빈을 정의했다면, 스프링 IoC 컨테이너는 해당 빈 정의로 유일한 1개의 객체 인스턴스를 생성합니다. 유일한 객체 인스턴스들은 캐시에 저장되고 해당 빈이 필요하면 저장된 캐시 객체를 반환합니다. 스프링의 싱글톤 개념과 디자인 패턴의 싱글톤 개념 다릅니다. 디자인패턴 싱글톤은 '클래스 로더'마다 특정 클래스의 유일한 1개의 인스턴스만 생성합니다. 하지만 스프링 싱글톤은 '스프링 컨테이너'마다 1개의 빈을 생성합니다. 즉, 하나의 스프링 컨테이너에 특정 클래스를 빈으로 정의했다면, 스프링 컨테이너는 해당 클래..
OOD, OOP(객체 지향 개발)의 원칙 - SOLID 개요 책에서 6장에 'OOD(객체 지향 개발)의 원칙'에서 5가지의 객체 지향 개발의 원칙을 설명하고 있습니다. 이 내용을 정리해보겠습니다. 또한 인프런 김영한님의 강의를 참고했습니다. 단 하나의 책임 원칙(The Single Responsibility Principle, SRP) 어떤 클래스를 변경해야 하는 이유는 오직 하나뿐이어야 한다. 클래스는 오직 하나의 주제만 알아야 합니다. 즉, 오직 하나의 책임만 져야 합니다. 다시 말해, 어떤 클래스를 변경해야 하는 이유는 오직 하나뿐이어야 합니다. 그림 6.1을 보겠습니다. 이 클래스는 너무 많은 정보를 가지고 있습니다. 임금과 세금을 계산하는 방법, 자신을 디스크에 저장하거나 읽어 오는 방법, 그리고 자신을 XML 입출력하는 방법, 다양한 보고서 형식으..
Generics의 Type Erasure(타입 소거) *개요 지네릭의 타입소거를 알아봅니다. 타입 소거란? 타입 소거는 지네릭을 사용할 때 '컴파일 타임'에 엄격한 타입 체크를 위해 자바에서 제공하는 전략입니다. 왜 '컴파일 타임'일까요? 지네릭 타입은 컴파일 타임에만 존재하고 런타임에서는 사라지도록 설계되었기 때문입니다. JDK 1.5 이전 버전에서는 지네릭이 존재하지 않았기 때문에 과거 레거시 코드와의 호환성을 위해 컴파일에서만 엄격하게 타입 체크를 하고 런타임은 동일하게 유지합니다. class 파일로 변환된 코드를 확인해보면 지네릭 코드는 하나도 없고 모두 적절하게 형 변환되어 레거시 코드와 호환을 보장할 수 있습니다. 개발자는 지네릭을 통해 컴파일 타임에 미리 문제를 파악할 수 있어 안전한 코딩을 할 수 있습니다. "지네릭 타입은 컴파일 타임에만 존..
Generics의 Wildcards(와일드카드) *개요 자바 문법 Generics의 Wildcards 내용을 정리합니다. Wildcards란? 지네릭 코드에서 물음표 (?) 이며, 다른 말로 알려지지 않은 타입(unknown type) 입니다. 매개변수, 필드, 로컬 변수, 리턴타입 등에 사용할 수 있습니다. (리턴타입은 구체적인 타입 선언이 바람직합니다.) 단, 와일드 카드는 지네릭 메서드 호출, 지네릭 클래스 생성, 슈퍼타입 생성에서 타입 인자(type argument)로 사용하지 않습니다. 와일드카드의 장점은 하나의 참조변수에 다양한 매개변수화된 타입을 가지는 지네릭 객체를 담는 다형성 구현입니다. 와일드카드 매개변수화된 타입은 new 인스턴스 초기화에 사용할 수 없습니다. (cannot be instantiated directly 에러 발생) ..
git 원격 브랜치 모두 로컬로 받아오기 *개요 git 원격 브랜치를 모두 로컬로 받아오는 명령어를 확인합니다 git branch -r | grep -v '\->' | sed "s,\x1B\[[0-9;]*[a-zA-Z],,g" | while read remote; do git branch --track "${remote#origin/}" "$remote"; done git pull --all 첫번째 줄은 명령어 공부를 통해 추후 정리 예정. git pull에는 git fetch와 git merge가 합쳐져 있으므로 아래 글의 빨간박스 git fetch --all 부분은 삭제합니다. https://stackoverflow.com/questions/10312521/how-do-i-fetch-all-git-branches#comment27984640..
[TDD, 클린 코드 with Java] 4. 수강신청 - 레거시 코드 리팩터링 *개요 수강신청 과제 피드백을 정리합니다. 1단계 - 레거시 코드 리팩터링 1:N 관계 로직 만들기 고민 의존성에 따라 객체 생성 위치를 정하라 생성, 수정 일시를 외부에서 주입받아라 코드 라인을 줄일 수 있으면 로직을 합치라 2단계 - 수강신청(도메인 모델) 도메인의 공통 칼럼은 하나의 인스턴스로 리팩토링하라 도메인의 enum을 내부, 외부에 정의하는 고민 도메인 책임 영역을 고민하라 유동적인 요구사항을 추가 구현하라 다른 도메인을 객체로 의존하기 vs 객체 id(pk)에 의존하기 연관이 있는 도메인 인스턴스를 묶어 관리하라 양방향 의존관계를 단방향으로 개선하라 3단계 - 수강신청(DB 적용) 인덱스 자료구조 검색을 제거하라 기존 도메인 유지하기 vs 새로운 도메인 추가하기 비지니스 책임을 Servic..
[TDD, 클린 코드 with Java] 3.사다리타기 - FP, OOP *개요 사다리타기 과제를 구현하면 피드백 받은 내용을 정리합니다. 2단계 - 사다리(생성) 매개변수 값 전달 시 변수명에 맞는 값을 전달하 매개변수 전달 시, personCount라는 매개변수명을 가지고 있습니다. 따라서 실제 전달은 personCount를 해야 합니다. Factory 분리를 고민하라 사다리를 생성하는 LadderFactory는 Ladder에서만 사용합니다. 이전에 로또번호를 생성하는 과제에서는 별도로 Factory를 분리했습니다. 제대로 로또 번호가 생성되었는지 테스트를 하기 위함이 큰데, 이번 리뷰에서는 오히려 만들지 않는 것이 낫다는 피드백을 받았습니다. 따로 정답이 있다고 생각하지 않습니다. 경우에 따라서 분리하거나 그냥 유지 할 수 있습니다. 중복된 유효성 검증을 제거하라 Lin..
[TDD, 클린 코드 with Java] 2.로또 - TDD * 개요 2단계 로또 TDD 과제를 하면서 피드백 받은 부분을 정리합니다 1단계 - 문자열 계산기(로또 - TDD) 메서드명의 의도를 분명하게 드러내라 메서드명을 단순하게 main으로 하지 않고 분명하게 의도가 드러나야 합니다. View에서 유효성 검증을 하지 마라 View는 말 그대로 데이터의 입출력만 관리합니다. 유효성 검사는 Controller나 도메인에서 합니다. Map은 O(n) 보다는 O(1) 을 고려하라 지금은 Map 원소의 갯수가 많이 없지만, 갯수가 많아지면 O(n)의 성능이 문제가 될 수 있습니다. 따라서 미리 선언하여 O(1)로 쉽게 검색이 가능하도록 합니다. @DisplayName으로 테스트 설명을 추가하라 테스트명으로 충분한 의도를 나타낼 수 있지만, @DisplayName을 사용..

728x90
반응형