전체 글 58

Dependency Injection (의존 관계 주입)

의존관계 주입은 크게 4가지 방법이 존재한다. 생성자 주입 수정자 주입(setter) 필드 주입 일반 메서드 주입 생성자 주입 생성자를 사용해 의존관계를 주입받는 방식 생성자 호출시점에 딱 1번만 호출되는 것이 보장됨 불변, 필수 의존관계에 사용 public class UserService { private UserRepository userRepository; public void setUserRepository(UserRepository userRepository) { this.userRepository = userRepository; } // ... } 수정자 주입(setter 주입) 필드의 값을 변경하는 setter 메서드를 활용하여 의존관계를 주입하는 방법 선택, 변경 가능성이 있는 의존관계에 ..

Spring 2023.04.10

전역 데이터 (Global Data)

전역데이터는 어느 곳에서 건드릴 수 있고 값을 누가 바꿨는지 찾아내기 어렵다는 단점이 있다. (자바에서의 전역 데이터는 예시로는 public static 으로 되어있는 변수가 있다.) 이러한 전역 데이터의 단점을 보완하기 위한 대표적인 리팩터링은 변수 캡슐화하기 이다. 변수 캡슐화 변수 캡슐화는 예시로 바로 알아보려고 한다. 주소를 가지고 있는 Address 클래스에 전역 변수로 postal Code 있다. public class Address{ public static String postalCode = 12345; ... } 이러한 클래스의 경우 외부 클래스에서 다음과 같이 값을 변경할 수 있다. public class UserService{ ... public void setPostalCode{ A..

Spring Rest Docs Tutorial

backend 개발자들이 API 문서화를 하는 방법에는 여러 가지 방법이 있다. 1. 수기를 통한 문서화 2. postman publish 기능을 통한 문서화 3. swagger를 활용한 문서화 4. Spring REST Docs를 활용한 문서화 ... 각각의 API 문서화마다 장단점이 있을 것이다. 특히 1번, 2번 방식은 별로 추천하지 않는 방식이다. [추천하지 않는 이유] api 명세가 바뀌었을 때 까먹고 바꿔주지 않는다면 api 명세 기능을 잃어버린다. 개발자가 실수로 오타를 내었을 때 누군가 알려주지 않는 이상 이를 발견하기 힘들다. Swagger와 Rest Docs 방식을 통한 API 문서화 방법 중 이번 장에서는 Spring Rest Docs를 활용한 API 문서화 방법을 알아보려고 한다. ..

Spring 2023.04.06

중복코드 (Duplicated Code)

똑같은 코드 구조가 여러 곳에서 반복된다면 하나로 통합하여 더 나은 프로그램을 만들 수 있다. 코드가 중복되면 각각 코드를 볼 때마다 차이점이 존재하는지 주의 깊게 봐야 한다. 만약 중복 코드 중 하나를 변경하려고 할 때에는 다른 비슷한 코드들도 모두 살펴보고 적절히 수정해야 한다. 함수 추출하기 클래스 내에서의 메서드가 똑같은 표현식을 사용하는 경우 문장 슬라이드하기 클래스 내에서의 메서드가 비슷한데 완전히 똑같지 않은 경우 메서드 올리기 같은 부모로부터 파생된 서브 클래스들에 코드의 중복이 있는 경우 함수 추출하기 여기서 함수란 객체지향 언어의 method 혹은 절차형 언어의 procedure / subroutine 에도 동일하게 적용된다. 함수 추출하기란 코드 조각을 찾아 무슨 일을 하는지 파악한 ..

기이한 이름 (Mysterious Name)

코드를 명료하게 설명하는 요소 중 하나는 이름이다. 그렇기 때문에 함수, 모듈, 변수, 클래스 들은 이름만 보고도 각각 무슨 일을 하고 어떻게 사용해야 하는지 명확하게 알 수 있어야 한다. 냄새와 관련한 Refactoring 기술은 다음과 같다. 함수 선언 바꾸기 이름 바꾸기 필드 이름 바꾸기 함수 선언 바꾸기 함수란 프로그램을 작은 부분으로 나누는 주된 수단이다. 함수 선언은 각 부분이 서로 맞물리는 방식을 표현하고, 소프트웨어에서는 연결부 역할을 한다. 연결부를 잘 정의하면 시스템에 새로운 부분을 추가하기 쉽지만, 잘못 정의하게 되면 요구사항이 바뀔 때 적절히 수정하기 어렵게 된다. 이러한 연결부에서 가장 중요한 요소는 함수의 이름이다. 예를 들어 게시글들을 가져오는 method가 있다고 가정하자. ..

DI 와 IOC에 대해서

IOC란 무엇인가? IOC는 Inversion Of Control의 약자로 제어의 역전을 의미한다. 다음 예시로 설명을 해보려고 한다. PostService, PostRepository는 인터페이스이며 PostServiceImpl, PostRepositoryImpl은 각 인터페이스를 구체화 한 구체 클래스이다. PostServiceImpl은 PostRepository를 의존하고 있는 상황이다. [PostServiceImpl] public class PostServiceImpl implements PostService { private final PostRepository postRepository; public PostServiceImpl(PostRepository postRepository) { thi..

Spring 2023.04.05

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

Robert Martin의 클린코드에서 좋은 객체 지향 설계의 원칙을 SOLID로 정의 하였다. S : SRP(Single Responsibility Principle) 단일 책임 원칙 O : OCP(Open/Closed Principle) 개방-폐쇄 원칙 L : LSP(Liskov Substitution Principle) 리스코프 치환 법칙 I : ISP(Interface Segregation Principle) 인터페이스 분리 원칙 D : DIP(Dependency Inversion Principle) 의존관계 역전 원칙 SRP (단일 책임 원칙) 하나의 클래스는 하나의 책임만 가져야 한다. 여기서 책임이란 상황에 따라 다른데 클 수도 있고 작을 수도 있다. 중요한 기준은 변경이다. 변경이 있을 때..

Java 2023.04.05

다형성 (Polymorphism)

객체 지향의 특징으로 추상화, 캡술화, 상속, 다형성이 있습니다. 그 중 오늘은 다형성에 대해 살펴보도록 하겠습니다. 객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 집단으로 보는 시각에서 벗어나 여러개의 독립된 단위, 객체들의 모임으로 파악하고자 하는 것입니다. 각각의 객체는 메세지를 주고받고, 데이터를 처리할 수 있습니다. 프로그램을 유연하고 변경이 용이하게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용됩니다. 실제 세계와 객체지향이 1:1 로 정확히 매칭되지는 않지만 비유를 위해 비교해보겠습니다. 세상은 역할 과 구현으로 구분을 할 수 있습니다. 자동차를 예로 들자면 위 그림에서 사람은 운전자 역할 이며 자동차는 자동차 역할 입니다. 전기차, 경유, 휘발유는 자동차 역할을 구현한 것입니다. 실..

Java 2023.04.05