JAVA 49

설계 품질과 트레이드오프 | 책임 할당하기 | 메시지와 인터페이스

조영호의 '오브젝트'를 읽고 알게 된 내용을 정리한다 😊4장. 설계 품질과 트레이드오프🌈 TIL객체지향설계는 올바른 객체에게 올바른 책임을 할당하는 것이다. 이를 통해 낮은 결합도와 높은 응집도를 가진 구조를 만들 수 있다.응집도는 모듈에 포함된 내부 요소들이 연관되어있는 정도다.결합도는 의존성의 정도다.캡슐화를 지키면 응집도는 높아지며 결합도는 낮아진다.데이터 중심의 설계는 캡슐화 위반, 높은 결합도, 낮은 응집도의 문제가 있을 가능성이 높다.접근자와 수정자 메서드를 사용하는 게 캡슐화를 한다고 생각했는데 아니라는 것을 알았다. 속성의 가시성을 private로 설정했다고 해도 접근자와 수정자를 통해 속성을 외부로 제공하면 캡슐화를 위반한 것이다.추측에 의한 설계전략(design-by-guessing..

JAVA 2024.08.25

이상한 나라의 객체 | 역할, 책임, 협력

요즘 가장 관심 있는 분야는 객체지향 설계다.최근에 했던 프로젝트를 리팩토링 하면서 디자인 패턴을 적용하여 문제도 해결하고 있다.리팩토링을 하는 것도 좋지만, 만약에 프로젝트 초기로 돌아간다면 좋은 객체지향 설계를 하는 것에 집중할 것 같다.이번 기회에 어쩌면 잘못 이해하고 있었을 수 있었던 객체지향 설계에 대해 제대로 알고 싶었다.이 책은 ' 객체지향의 사실과 오해'의 저자로 유명하신 조영호님이 쓰셨다.예전에 '객체지향의 사실과 오해'는 조금 읽다가 이해하기 어려워서 다 읽지 못했었다. 🥹'오브젝트'는 목차랑 내용을 살펴보니 예제도 많고 이해하기 쉬울 것 같아서 구입했다.'오브젝트'를 다 읽으면 '객체지향의 사실과 오해'도 읽을 예정이다. 😁알게 된 내용은 프로젝트에도 적용해야지!!!  2장. 이상..

JAVA 2024.07.15

Facade Pattern

한 서비스에서 여러 레포지토리를 참조하고 있는 게 서비스 입장에서 과도한 책임을 가지게 된다는 것을 알게 되었다.이를 해결하기 위해 디자인 패턴 중 하나인 Facade Pattern을 적용하였다.   🍗 Facade Pattern 적용 후 PaymentServiceFacade Pattern을 적용한 후 PaymentFacadeRepository클래스만 참조하면 되기 때문에 책임이 줄어들었다.Interface를 만들지 고민했는데 기능을 확장할 가능성이 없으면, 구현체를 사용하는 것만으로 충분하다고 생각했다.@Slf4j@Service@RequiredArgsConstructorpublic class PaymentService { private final PaymentsConfirmClient payme..

JAVA 2024.07.03

HttpURLConnection | RestTemplate | WebClient

개발 환경: OpenJDK 17, Spring Boot 3.1.7 사용한 API: https://developers.kakao.com/docs/latest/ko/daum-search/dev-guide#search-book HttpURLConnection public abstract class HttpURLConnection extends URLConnection JDK 1.1부터 내장하고 있는 클래스다. 각 HttpURLConnection 객체는 단일 요청을 만드는데 사용된다. 하지만, 네트워크 연결에 따라서 HTTP 서버는 공개적으로 다른 인스턴스로부터 공유될 수 있다. 요청이 끊어진 후 InputStream 또는 OutputStream에서 close() 메서드 호출하는 것은 어떠한 공유된 영구적인 연..

JAVA 2023.12.28

enums(열거형)

enums 열거형 상수간의 비교에 '=='를 사용 가능 열거형 상수간의 비교 연산자로 ''는 사용 불가하니 compareTo()를 사용 열거형 상수의 값이 변경되어도 기존의 소스를 다시 컴파일하지 않아도 된다. enum 열거형이름 {상수명1, 상수명2, ...} 열거형 정의 열거형이름.상수명 열거형에 정의된 상수를 사용 열거형이름[] 변수명 = 열겨형이름.values(); 열거형에 정의된 모든 상수를 출력

JAVA 2023.05.22

Thread(쓰레드)

Thread 프로세스(실행 중인 프로그램)의 자원을 이용해서 작업을 수행하는 것 모든 프로세스에는 최소한 하나 이상의 쓰레드가 존재 프로세스의 메모리 한계에 따라 쓰레드의 수가 결정된다. 구현 방법 Thread클래스를 상속받기 ⚠️ 다른 클래스를 상속받을 수 없다. [일반적인 방법] Runnable인터페이스를 구현하기 Runnable인터페이스를 구현한 클래스의 인스턴스를 생성한 다음, 이 인스턴스를 Thread클래스의 생성자의 매개변수로 제공해야 함 실행 방법 start()를 호출한다. 실행대기중인 쓰레드가 하나도 없으면 곧바로 실행상태가 된다. 하나의 쓰레드에 대해 start()는 한 번만 호출될 수 있다. ⚠️ 하나의 쓰레드에 대해 두 번 이상 호출하면 IllegalThreadStateExceptio..

JAVA 2023.04.24

JVM

JVM(Java Virtual Machine) 시스템 메모리를 관리하면서 자바 기반 애플리케이션을 위해 이식 가능한 실행 환경 제공 JVM은 자바 클래스 로더(Class Loader)와 자바 실행 엔진(Execution Engine)에 의존 JVM 자바 클래스 로더 클래스를 메모리에 로드하고 실행을 위해 사용할 수 있게 만드는 JVM의 일부 클래스 로딩(Class Loading)을 최대한 효율적으로 수행하기 위해 지연 로딩(Lazy-loading)과 캐싱(Caching) 같은 기법을 활용 JVM 실행 엔진 클래스 로더가 클래스를 로딩하는 작업을 마치면, JVM은 각 클래스에 있는 코드를 실행하기 시작 JVM 실행에 실행 엔진은 필수적이다. 파일 시스템 액세스, 네트워크 입출력을 위한 리소스를 관리 ⚙️ ..

JAVA 2023.04.23

Abstract class(추상 클래스)

abstract class(추상 클래스) 하나 이상의 추상 메서드를 포함하는 클래스 다형성을 가지는 메소드의 집합을 정의하도록 한다. 반드시 사용되어야 하는 메소드를 추상 메소드로 선언해서 이 클래스를 상속받는 모든 클래스는 이 추상 메서드를 반드시 재정의하게 한다. 인스턴스를 생성할 수 없다. 상속을 통해 자식 클래스를 만들고, 자식 클래스에서 추상 메서드를 모두 오버라이딩해야 자식 클래스의 인스턴스를 생성할 수 있다. abstract class 클래스명{ abstract 반환타입 메서드명(); } abstract method(추상 메소드) 상속받는 자식 클래스가 반드시 추상 메소드를 구현하도록 한다. 선언부만 존재 구현부를 자식 클래스에서 오버라이딩해서 사용 abstract 반환타입 메소드명(); 👇..

JAVA 2023.03.23

javax

javax.servlet.http.Cokkie, javax.servlet.http.HttpServletRequest를 import해야해서 javax에 대해 찾아봤다. javax Java API의 일부 Java SE(Java Standard Edition)와 Java EE(Java Enterprise Edition)에서 사용되는 패키지들을 담고 있는 패키지 이름의 접두사 javax.servlet을 사용하기 위해 Java EE를 지원하는 서블릿 컨테이너를 사용 나는 아래처럼 서블릿 컨테이너 중에서 Tomcat을 사용할거다. build.gradle에 의존성을 추가 implementation 'org.springframework.boot:spring-boot-starter-web' Spring Boot Star..

JAVA 2023.03.03