클린코드로 유명한 로버트 마틴이 좋은 객체 지향 설계의 5가지 원칙을 정리하였다. SRP: 단일 책임 원칙(Single Responsibility Principle) OCP: 개방-폐쇄 원칙(Opne Closed Principle) LSP: 리스코프 치환 원칙(Liskov Substitution Principle) ISP: 인터페이스 분리 원칙(Interface Segregation Principle) DIP: 의존관계 역전 원칙(Dependency Inversion Principle) SRP 단일 책임 원칙(Single Responsibility Principle) 한 클래스는 하나의 책임을 가져야 한다. 하나의 책임이라는 기준은 모호하다. 클 수도 있고, 작을 수도 있다. 문맥과 상황에 따라 다르다...
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/ORKGY/btrrLNsCCwc/XaQfyA6i3JhIpdFlmd92qK/img.png)
스프링에서 docker-compose.yml 파일을 이용하여 redis를 띄워보자 docker-compose.yml version: "3" services: redis: image: redis:latest restart: always container_name: redis ports: - 6379:6379 volumes: - ~/docker-volumes/redis/data:/data 각 문법은 아래와 같다. version docker-compose.yml 파일의 명세버전 docker-compose.yml 버전에 따라 지원하는 도커 엔진 버전도 다르다. services 실행할 컨테이너를 정의 docker run —name redis와 같다고 할 수 있다. image 컨테이너에 사용할 이미지 이름과 태그 ..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/dpQQZN/btrrD9db3XF/x4NHFH8d5xmgk9czenA8j0/img.png)
ps docker ps 실행중인 컨테이너 목록을 확인하는 명령어 docker ps -a 중지된 컨테이너도 확인하려면 -a 옵션을 붙인다. stop docker stop [OPTIONS] CONTAINER [CONTAINER ...] 실행중인 컨테이너를 중지하는 명령어이다. 실행중인 컨테이너를 하나 또는 여러개(띄어쓰기로 구분) 중지할 수 있다. rm docker rm [OPTIONS] CONTAINER [CONTAINER ...] 종료된 컨테이너를 완전히 제거하는 명령어이다. logs docker logs [OPTINS] CONTAINER 컨테이너가 정상적으로 동작하는지 확인하는 가장 좋은 방법이다. images dokcer images [OPTIONS] [REPOSITORY[:TAG]] 도커가 다운로드..
멱등성 멱등은 한 번 호출하든 두 번 호출하든 백 번 호출하든 결과가 항상 똑같다. f(f(x)) = f(x) 멱등 메서드 GET : 한 번 조회하든, 두 번 조회하든 같은 결과가 조회된다. PUT : 결과를 대체한다. 따라서 같은 요청을 여러번 해도 최종 결과는 같다. DELETE : 결과를 삭제한다. 같은 요청을 여러번 해도 삭제된 결과는 똑같다. POST : 멱등이 아니다! 두 번 호출하면 같은 결제가 중복해서 발생할 수 있다. 특징 재요청 하는 중간에 다른 곳에서 리소스를 변경했다면? 사용자 A : GET -> username:A, age:20 사용자 B : PUT -> username:A, age:30 사용자 A : GET -> username:A, age:30 멱등은 외부 요인으로 중간에 리소..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/mze6j/btrrqbBAZiR/QeSh2wKWWkFikyNC0iaKvk/img.jpg)
시스템 시스템 제작과 시스템 사용을 분리하라 소프트웨어 시스템은 (애플리케이션 객체를 제작하고 의존성을 서로 ‘연결’하는) 준비 과정과 (준비 과정 이후에 이어지는) 런타임 로직을 분리해야 한다. Main 분리 시스템 생성과 시스템 사용을 분리하는 한 가지 방법으로, 생성과 관련한 코드는 모두 main이나 main이 호출하는 모듈로 옮기고, 나머지 시스템은 모든 객체가 생성되었고 모든 의존성이 연결되었다고 가정한다. 팩토리 객체 생성 시점을 애플리케이션이 결정할 필요가 있을 때 Abstract Factory 패턴을 사용하여 코드를 감춘다. 객체를 생성하는 시점은 애플리케이션이 결정하지만 객체를 생성하는 코드는 애플리케이션이 모른다. 의존성 주입(DI) 사용과 제작을 분리하는 강력한 메커니즘 중 하나이다...
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/bSEwjB/btrrr5gzQwX/bd5lgh4CLfAFp1WxRpfb70/img.jpg)
클래스 클래스 체계 클래스를 정의하는 표준 자바 관례에 따르면, 가장 먼저 변수 목록이 나오고 변수 목록 다음에는 공개 함수가 나온다. class Example { 변수들 ... 함수들 ... } 변수: 정적 공개 상수 -> 정적 비공개 변수 -> 비공개 인스턴스 변수 -> 공개 변수 변수 목록 다음에는 공개 함수가 나온다. 즉, 추상화 단계가 순차적으로 내려간다. 클래스는 작아야 한다! 클래스를 설계할 때도, 함수와 마찬가지로 ‘작게’가 기본 규칙이다. 함수는 물리적인 행 수로 크기를 측정했다면, 클래스는 맡은 책임을 센다. 작명은 클래스 크기를 줄이는 첫 번째 관문이다. 간결한 이름이 떠오르지 않는다면 필경 클래스 크기가 너무 커서 그렇다. 단일 책임 원칙(Single Responsibility Pr..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/LtlEo/btrruAN9rUO/EsBkdbOv6fDkQw1CKkwk6k/img.jpg)
오류 처리 오류 코드보다 예외를 사용하라 오류를 코드로 처리하면 호출자 코드가 복잡해진다. 함수를 호출한 즉시 오류를 확인해야 하기 때문이다. 오류가 발생하면 예외를 던지는 편이 낫다. 호출자 코드가 더 깔끔해진다. public void sendShutDown(){ try{ tryToShutDown(); }catch(DeviceShutDownError e){ logger.log(e); } } 예외를 던지고 코드를 분리함으로써 각 개념을 독립적으로 살펴보고 이해할 수 있다. Try-Catch-Finally 문부터 작성하라 try-catch-finally 문에서 try 블록에 들어가는 코드를 실행하면 어느 시점에서든 실행이 중단된 후 catch 블록으로 넘어갈 수 있다. try 블록에서 무슨 일이 생기든지 ..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/E4zew/btrrxmPyGOo/WZKQ4TXKp9pigA7uqUjcL0/img.png)
@Entity @Entity가 붙은 클래스는 JPA가 관리하게 된다. JPA를 사용해서 테이블과 매핑할 클래스는 @Entity를 필수로 선언해야 한다. 하이버네이트는 프록시 DB 연산 결과를 상속한 클래스의 기본 생성자를 호출하여 매핑한다. 이때, 알맞게 결과 값을 넣어주기 위해서는 public 또는 protected 레벨의 기본 생성자가 필요하다. @Entity public class Member{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; public Member(){ } public Member(final Long id, final String name){ this.id = ..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/cx3p7L/btrrxYBdmUC/YqYxOo2v1An076ofQvRjF0/img.jpg)
형식 맞추기 적절한 행 길이를 유지하라 파일 길이가 짧아도, 커다란 시스템을 구축할 수 있다. 일반적으로 큰 파일보다 작은 파일이 이해하기 쉽다. 개념은 빈 행으로 분리하라 거의 모든 코드는 왼쪽에서 오른쪽으로 그리고 위에서 아래로 읽힌다. 각 행은 수식이나 절을 나타내고, 일련의 행 묶음은 완결된 생각 하나를 표현한다. 생각 사이는 빈 행을 넣어 분리해야 마땅하다. 빈 행은 새로운 개념을 시작한다는 시각적 단서다. 세로 밀집도 줄바꿈이 개념을 분리한다면 세로 밀집도는 연관성을 의미한다. 즉, 서로 밀집한 코드 행은 세로로 가까이 놓여야 한다. 수직 거리 서로 밀접한 개념은 세로로 가까이 둬야 한다. 같은 파일에 속할 정도로 밀접한 두 개념은 세로 거리로 연관성을 표현한다. 변수 선언 변수는 사용하는 위..
같은 타입의 Bean이 2개 이상 일 때 @Autowired는 타입(Type)으로 조회하는데, 이때 선택된 빈이 2개 이상일 때 NoUniqueBeanDefinitionException: No qualifying bean of type ...에러가 발생한다. 예제를 위해 DiscountPolicy의 하위 타입인 FixDiscountPolicy와 RateDiscountPolicy를 스프링 빈으로 선언해보자. @Component public class FixDiscountPolicy implements DiscountPolicy { } @Component public class RateDiscountPolicy implements DiscountPolicy { } 여기서 다음과 같이 의존관계 자동 주입을 실..
- Total
- Today
- Yesterday
- 자료구조
- mysql 8.0
- webflux
- 북클럽
- 정렬
- 노마드
- Real MySQL
- 스프링
- 문자열
- MySQL
- 리팩토링
- 데이터베이스
- 인프런
- 구현
- 스프링 부트
- 릿코드
- Algorithm
- kotlin
- Spring
- 그리디
- 코틀린
- 파이썬
- 코테
- 노마드코더
- 김영한
- 알고리즘
- spring boot
- leetcode
- 백준
- 스프링부트
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |