분류 전체보기
-
[Effective Java] 아이템21: 인터페이스는 구현하는 쪽을 생각해 설계하라Language/Java 2022. 7. 14. 15:47
자바 8 전에는 기존 구현체를 깨뜨리지 않고는 인터페이스에 메서드를 추가할 방법이 없었으나,자바 8 부터는 디폴트 메서드가 소개되면서 기존 인터페이스에 메서드를 추가할 수 있게 되었다. 그러나 이렇게 추가된 디폴트 메서드가 모든 기존 구현체들과 매끄럽게 연동되리라는 보장은 없다. ✔️ 디폴트 메서드 추가 시 주의사항 1️⃣ 디폴트 메서드는 컴파일에 성공하더라도 기존 구현체에 런타임 오류를 일으킬 수 있다. 흔한 일은 아니지만, 일어나지 않으리라는 보장도 없다. 2️⃣ 기존 인터페이스에 디폴트 메서드로 새 메서드를 추가하는 일은 꼭 필요한 경우가 아니면 피해야 한다. 추가하려는 디폴트 메서드가 기존 구현체들과 충돌하지 않을지 심사숙고해야 한다. 또한, 메서드를 제거하거나 기존 메서드의 시그니처를 수정하는 ..
-
[Effective Java] 아이템20: 추상 클래스보다는 인터페이스를 우선하라Language/Java 2022. 7. 9. 09:02
✔️ 인터페이스 vs 추상 클래스 자바가 제공하는 다중 구현 메커니즘은 인터페이스와 추상 클래스 2가지다. 두 메커니즘 모두 인스턴스 메서드를 구현 형태로 제공할 수 있다. 둘의 가장 큰 차이는 추상 클래스가 정의한 타입을 구현하는 클래스는 반드시 추상 클래스의 하위 클래스가 되어야 한다는 점이다. 자바는 단일 상속만을 지원하므로, 추상 클래스 방식은 새로운 타입을 정의하는 데 커다란 제약을 안겨준다. 반면 인터페이스가 선언한 메서드를 모두 정의하고 그 일반 규약을 잘 지킨 클래스라면 다른 어떤 클래스를 상속했든 같은 타입으로 취급된다. 또한 기존 클래스에도 손쉽게 새로운 인터페이스를 구현해넣을 수 있다. (인터페이스가 요구하는 메서드를 추가하고, 클래스 선언에 implements 구문을 추가하기만 하면..
-
[Effective Java] 아이템19: 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라Language/Java 2022. 7. 9. 09:01
✔️ 상속을 고려한 문서화와 설계 문서화 상속용 클래스는 재정의할 수 있는 메서드들을 내부적으로 어떻게 이용하는지 문서로 남겨야 한다. 재정의 가능 메서드를 호출할 수 있는 모든 상황을 문서로 남겨야 한다. * 재정의 가능 메서드: public과 protected 메서드 중 final이 아닌 모든 메서드. @implSpec 태그 메서드 주석에 붙여주면 자바도 도구가 "Implementation Requirements"로 시작하는, 메서드의 내부 동작 방식을 설명하는 절을 생성해준다. 이 태그를 활성화하려면 명령줄 매개변수로 -tag "implSpec:a:Implementation Requirents:"를 지정해주면 된다. protected 메서드 및 필드 클래스의 내부 동작 과정 중간에 끼어들 수 있는 ..
-
[따라하며 배우는 도커와 CI환경] 9. 복잡한 어플을 실제로 배포해보기(테스트 & 배포 부분)DevOps/Docker 2022. 7. 5. 00:24
이제 소스코드를 테스트한 후 테스트 성공 시, AWS를 통해 배포하는 부분을 추가할 것이다. 애플리케이션을 배포하는 과정은 다음과 같다. Travis CI에서 바로 AWS Elastic Beanstalk으로 전달하지 않고, Docker Hub에 빌드된 이미지를 보관함으로써 이미지를 한 번만 빌드하도록 한다. ✔️ Github 에 소스코드 업로드 1️⃣ github에서 repository 생성하기 2️⃣ 로컬 git 저장소 만들기 $ git init 3️⃣ .gitignore 파일 추가 node_modules mysql_data 4️⃣ 커밋하기 $ git add . $ git commit -m "first commit" 5️⃣ remote 저장소에 push 하기 처음에는 remote 저장소를 추가한 후, ..
-
[Effective Java] 아이템18: 상속보다는 컴포지션을 사용하라Language/Java 2022. 7. 2. 04:45
이번 아이템에서 논하는 상속은 클래스가 다른 클래스를 확장하는 구현 상속을 말한다. 클래스가 인터페이스를 구현하거나 인터페이스가 다른 인터페이스를 확장하는 인터페이스 상속과는 무관하다. ✔️ 상속의 위험성 메서드 호출과 달리 상속은 캡슐화를 깨뜨린다. 상위 클래스가 릴리스 때 내부 구현이 달라지면, 그 여파로 하위 클래스가 오동작할 수 있다. 메서드를 재정의하는 대신 새로운 메서드를 추가하더라도, 문제가 발생할 수 있다. 상위 클래스의 새 메서드와 시그니처가 같고 반환 타입이 다르다면, 컴파일 오류가 발생한다. 시그니처와 반환 타입 모두 같을 경우, 상위 클래스의 메서드를 재정의한 것이 된다. 새로 추가한 메서드가 상위 클래스의 메서드가 요구하는 규약을 만족하지 못할 가능성이 크다. ✔️ 컴포지션 (Co..
-
[Effective Java] 아이템17: 변경 가능성을 최소화하라Language/Java 2022. 6. 29. 16:00
✔️ 자바 플랫폼 라이브러리의 불변 클래스 String 기본 타입의 박싱된 클래스들 ex) Integer, Long, Double BigInteger BigDecimal→ ✔️ 불변 클래스 만들기 위한 규칙 (5가지) 객체의 상태를 변경하는 메서드(변경자)를 제공하지 않는다. 클래스를 확장할 수 없도록 한다. → 2가지 방법이 있다. (클래스 상속 방지하는 방법 참고) 모든 필드를 final로 선언한다. 모든 필드를 private으로 선언한다. 자신 외에는 내부의 가변 컴포넌트에 접근할 수 없도록 한다. 생성자, 접근자, readObject 메서드 모두에서 방어적 복사를 수행하라. ✔️ 불변 클래스 예시: 복소수 클래스 // 불변 복소수 클래스 public final class Complex { priv..
-
[Effective Java] 아이템16: public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라Language/Java 2022. 6. 24. 23:55
class Point { public double x; public double y; } 위의 클래스는 데이터 필드를 직접 접근할 수 있어, 캡슐화의 이점을 제공하지 못 한다. API를 수정하지 않고는 내부 표현을 바꿀 수 없고, 불변식을 보장할 수 없으며, 외부에서 필드에 접근할 때 부수 작업을 수행할 수도 없다. class Point { private double x; private double y; public Point(double x, double y) { this.x = x; this.y = y; } public double getX() { return x; } public double getY() { return y; } public void setX(double x) { this.x = x..
-
[따라하며 배우는 도커와 CI환경] 8. 복잡한 어플을 실제로 배포해보기(개발 환경 부분)DevOps/Docker 2022. 6. 22. 21:01
지난 포스트에서는 리액트 컨테이너 하나만 실행하는 싱글 컨테이너 애플리케이션을 만들어보았다. 이번엔 프론트엔드 뿐만 아니라 백엔드 서버, 데이터베이스까지 사용하도록 다음과 같은 풀스택(멀티 컨테이너) 애플리케이션을 만들 것이다. ✔️ Multi Container 애플리케이션을 위한 설계 Multi Container 애플리케이션을 설계하는 방법 2가지를 알아보자. 1️⃣ Nginx의 Proxy를 이용한 설계 장점 Request를 보낼 때 URL 부분을 host 이름이 바뀌어도 변경시켜주지 않아도 된다. 포트가 바뀌어도 변경하지 않아도 된다. axios.get('/api/values') 단점 nginx 설정, 전체 설계가 다소 복잡하다. 2️⃣ Nginx는 정적파일을 제공만 해주는 설계 장점 설계가 다소 간..