본문 바로가기

java27

[일일 회고] 22.02.10~11 - 웹클라이언트, 소켓 프로그래밍 📚TIL 웹브라우저와 동일하게 작동하는 간단한 웹 클라이언트를 구현했다. DNS Lookup으로 URI에서 IP 주소를 알아내고 간단한 Socket 프로그래밍을 통해 서버와 HTTP 통신을 하였다. socket()과 입출력 스트림을 제외하고 HTTP 표준 라이브러리 없이 직접 구현했다. ✅ 구현해보니 디자인 패턴이었다? 처음 Client와 Request, Response 객체를 설계했다. 특히 Request 객체 생성 시 많은 매개변수를 넣어 한 번에 생성하고 싶었다. (uri, get, header 들) 처음엔 매개변수 별 생성자를 많이 만들었다. 하지만 header의 개수가 정해진 것이 아니었기 때문에 문제가 있었다. 그래서 처음에 빈 객체를 리턴하고 이를 세터 메서드로 초기화했다. 그렇게 구현하던 .. 2022. 2. 11.
생성자에 매개변수가 많다면 빌더 패턴을 써볼까?! (HTTPClient와 lombok @Builder) 🧰 이 글은 책 이펙티브 자바 3판 Item 2와 하단 Reference 참고했습니다. 잘못된 내용이 있다면 편하게 말씀해주세요 🙏🏻 목차 1. 점층적 생성자 패턴(Telescoping Constructor pattern) 2. 자바빈즈 패턴(JavaBeans pattern) 3. 빌더 패턴(Builder pattern) - 빌더 패턴 사용 예 : java.net +a) lombok의 @Builder를 사용한 빌더 패턴 사용 +a) 다른 언어의 빌더 패턴 한 줄 요약 : 생성자에 매개변수가 많다면 빌더 패턴(Builder pattern)을 써보자. 이전 글 객체 생성할 때 '생성자' 대신 '정적 팩토리 메서드'를 써볼까? 🏭 에서 생성자 대신 정적 팩토리 메서드를 사용하면 좋은 이유를 알아봤다. 그렇다면 생.. 2022. 2. 11.
[일일 회고] 22.02.07~08 - 도커 컴포즈, DB, JDBC 🐳 📚개발 일지 어제오늘 프로젝트는 도커를 활용해 mysql:5.7 컨테이너 올리고 100만 개의 더미 데이터를 생성한다. Java에서 간단한 사용자 입력 콘솔 프로그램을 만들어 JDBC를 가지고 CRUD 작업을 했다. 내용에 앞서 과연 도커 컨테이너를 통해 데이터베이스를 운영하는게 좋은 방법일까? 테스트 용도의 DB는 상관 없겠지만 실제 프로덕션 DB는 안전해야하기 때문에 도커보다 로컬이나 클라우드가 제공하는 DB는 어떨까? ✅ 도커컴포즈 활용 도커 명령어를 활용한 컨테이너 실행은 환경 변수나 데이터 복사 붙여 넣기가 불편했다. mysql root 비밀번호 노출도 있었다. # 도커 명령어 docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -.. 2022. 2. 8.
표준 예외를 사용하자 이 글은 책 이펙티브 자바 3판 Item72과 하단 Reference 참고했습니다. 잘못된 내용이 있다면 편하게 말씀해주세요 🙏🏻 결론 자바 언어가 제공하는 표준 예외는 충분히 많다. 직접 만들지 말고 현재 상황에 맞는 표준 예외를 찾아 사용하자 이전 글 표준 라이브러리를 익히고 사용하자 에서 표준 라이브러리를 써야 하는 이유에 대해 알아봤다. 예외를 던질때도 마찬가지이다. 표준 예외를 사용하자. 왜? 읽기 쉬워진다. 메모리 사용량 감소, 클래스 적재 시간 감소, 예외도 직렬화에 포함되기 때문에 표준 사용이 좋다 자주 쓰이는 예외 예외 쓰임 예 IllegalArgumentException 허용하지 않는 값이 인수로 건네졌을 때 (null일 때 써도 되지만 따로) 나이를 나타내는 매개변수에 음수가 들어올 .. 2022. 2. 6.
자바에서 객체 복사는 clone()이 아닌 복사 생성자, 팩토리를 사용하자 이 글은 책 이펙티브 자바 3판 Item 13과 하단 Reference를 참고했습니다. 잘못된 내용이 있다면 편하게 말씀해주세요 🙏🏻 결론 객체를 복사할 때 특별한 경우(이미 Cloneable로 구현한 클래스로 사용하고 있을 때)를 제외하고 복사 생성자와 복사 팩토리를 사용하자 자바에서 객체를 복사할 때 어떻게 할까? 방법은 보통 2가지가 있다. 1. Object 객체의 clone() 메서드 + Cloneable 인터페이스 사용 2. 복사 생성자 또는 복사 팩토리 사용 1번의 경우 Object.clone() 메서드가 있다. 복사가 필요한 클래스에서 이를 오버 라이딩하여 사용한다. 이때 Cloneable 인터페이스를 받아 구현한다. Cloneable를 받지 않으면 clone()는 예외를 던지게 설계되어있기.. 2022. 2. 5.