분류 전체보기 100

실시간 데이터 전송 방식 1) SSE(Server-Sent Events)를 Java와 Javascript로 구현하기

[목차]0. SSE를 도입하게 된 이유 1. SSE 기본 개념 2. 장점/단점 3. 전체 흐름 요약 (지금 작성한 부분) 4. SSE Q&A 0. SSE로 구현하게 된 이유 대시보드에 실시간으로 데이터를 표시해야 하는 기능을 구현할 필요가 있었다.처음에는 REST API polling 방식(주기적으로 HTTP 요청 보내서 데이터 받아오기)을 고려했지만,데이터 전송 주기에 따라 딜레이가 발생하고, 서버와 클라이언트 모두에 불필요한 부하가 생길 수 있었다. "완전히 실시간에 가깝게 데이터를 보여주고 싶다.""그렇지만 복잡한 양방향 소켓 통신까지는 필요 없다." 이런 요구를 충족시킬 수 있는 다른 방식을 찾게 되었다. 이 조건을 충족하는 기술로 SSE(Server-Sent Events)를 선택했다. ..

Java/Java 2025.04.21

[내 코드가 그렇게 이상한가요?] 14장 리팩터링 : 기존의 코드를 성장시키는 기술

리팩터링이란?  실질적인 동작은 유지하면서, 구조만 정리하는 작업입니다.  실질적인 동작이 변하지 않았음을 확인할 수 있는 방법으로는 단위 테스트 등이 있습니다.    리팩터링 대상 코드는 아래와 같습니다.class PurchasePointPayment{ final CustomerId customerId; // 구매자의 ID final ComicId comicId; // 구매할 웹툰의 ID final PurchasePoint consumptionPoint; // 구매에 필요한 포인트 final LocalDateTime paymentDateTime; // 구매 일자 PurchasePointPayment(final Customer customer, final Comic comi..

모듈간 예외 처리 전략

모듈화 된 시스템은 각 모듈이 독립적으로 기능을 수행할 수 있도록 만들어 준다. 그리고 각 모듈에서 발생하는 예외는 어떻게 관리하고 전달할지에 대한 고민이 필요하다.    평소에 예외 처리 전략을 공통으로 발생하는 예외와 모듈에서 발생할 수 있는 예외 이렇게 구분해서 사용하고 있었다. 아래 영상을 보면서  "모듈로 구성할 때, 해당 모듈에서 발행하는 예외는 그 모듈 내에 두어야 한다." 를 알게 되었다.  https://www.youtube.com/watch?v=bjaiaEEllMI     모듈화 된 시스템의 원칙 중 하나는 모듈은 스스로 독립적일 수 있어야 한다.    즉, 모듈은 다른 시스템에 의존하지 않고, 독립적으로 기능을 수행할 수 있어야 한다.      그래서 예외 처리할 때는 모듈에서 발생하..

Java/Java 2025.02.09

[Java] Enum 클래스 실무 활용기 1 (with JavaScript)

Enum 클래스를 언제 사용해야하는지 예전에 고민이 많았었는데, 리팩토링을 하면서 활용할 곳들이 많이 보인다.      Enum 클래스를 활용하는 방법들을 하나씩 정리하려고 한다.      [게시판 CRUD]  게시판에서 CRUD 작업을 처리할 때 Enum을 활용할 수 있다.   1. CRUD 작업에 해당하는 값들인 CREATE, READ, UPDATE, DELETE를 Enum 클래스에 정의한다.public enum ActionType { CREATE("C"), READ("R"), UPDATE("U"), DELETE("D"); private String value; private ActionType(String value) { this.value = ..

[내 코드가 그렇게 이상한가요?] 13장 모델링:클래스 설계의 토대

시스템은 목적을 달성하기 위한 수단입니다. 그리고 모델은 시스템의 구성 요소들입니다.  모델이란 특정 목적 달성을 위해 최소한으로 필요한 요소를 갖춘 것입니다.    예시 - 온라인 쇼핑몰상품 매매를 시스템화한 것온라인 쇼핑몰은 매매가 효율적으로 이루어지게 도와줌    모델로 구분하기 전상품 classID상품영원가판매 가격제조년월일제조 업체보증 기간대응 통신 규격구성 부품ㅂ부품 재료부품 제조업자유통 기한소비 기한...    모델 별로 구분한 후 1) 주문 시의 상품 모델최소한으로 필요한 요소 - 상품ID, 상품명, 판매 가격, 재고 수량 등 주문 시의 상품 classID상품명판매 가격재고 수량...   2) 배송 시의 상품 모델최소한으로 필요한 요소 - ID, 크기, 무게 등 배송 시의 상품 classI..

[내 코드가 그렇게 이상한가요?] 12장 메서드(함수):좋은 클래스에는 좋은 메서드가 있다

[메서드 설계 방법] 1. 반드시 현재 클래스의 인스턴스 변수 사용하기다른 클래스의 인스턴스 변수를 변경하는 메서드는 좋지 않습니다. 응집도가 낮은 구조가 될 수 있기 때문입니다.   2. 불변을 활용해서 예상할 수 있는 메서드 만들기불변을 활용해서 예상치 못한 동작 자체를 막을 수 있게 설계하기 바랍니다.   3. 묻지 말고 명령하라메서드를 호출하는 쪽에서는 복잡한 처리를 하지 않는 것이 좋습니다.   (5장 참고)다른 객체의 내부 상태(변수)를 기반으로 판단하거나 제어하려고 하지 말고, 메서드로 명령해서 객체가 알아서 판단하고 제어하도록 설계하라는 의미입니다. 인스턴스 변수를 private으로 변경해서, 외부에서 접근할 수 없게 합니다. (setter, getter 주의!!)그리고 인스턴스 변수에 대..

[내 코드가 그렇게 이상한가요?] 11장 주석:유지 보수와 변경의 정확성을 높이는 주석 작성 방법

1. 내용이 낡은 주석 처음 개발 내용과 달리 이후에 사양이 변경되면서 주석까지 유지 보수하지 못한 경우입니다. 주석이 낡아 버리지 않게, 구현을 변경할 때 주석도 함께 변경하는 것이 좋습니다.  1) 주석은 실제 코드가 아님을 이해하기  2) 로직의 동작을 설명하는 주석은 낡기 쉽다코드의 동작을 그대로 설명하는 주석은 코드를 변경할 때마다 주석도 변경해야 할 것입니다. 만약 실수로 변경하지 않으면, 로직과 주석 사이에 괴리가 생깁니다.    2. 주석 때문에 이름을 대충 짓는 예메서드는 주석으로 설명을 추가하기보다, 메서드의 이름 자체를 수정하는 것이 좋습니다. 메서드의 가독성을 높이면, 주석으로 설명을 추가하지 않아도 됩니다. 그러면 내용이 낡은 주석이 생길 가능성도 줄어듭니다.     3. 의도와 ..

[내 코드가 그렇게 이상한가요?] 10장 이름 설계:구조를 파악할 수 있는 이름

1. 악마를 불러들이는 이름 class 상품 { public void 상품 예약(){ //예약과 관련된 로직 ... } public void 상품 주문(){ //주문과 관련된 로직 ... } public void 상품 출고(){ //출고과 관련된 로직 ... } public void 상품 발송(){ //발송과 관련된 로직 ... }}   [문제점] 거대해진 상품 클래스에 사양 변경이 발생하면 변경된 부분의 영향을 받아 동작에 버그가 생기지는 않는지, 상품 클래스와 관련된 클래스를 모두 확인해야 합니다.    [개선점] 1) 관심사 분리하기관심사 분리는 '관심사(유..

[내 코드가 그렇게 이상한가요?] 9장 설계의 건전성는 여러 악마

1. 데드 코드 - 실제로 실행되는 코드가 아니면 제거하자.    2. YAGNI 원칙 - 'You Aren't Gonna Need It.' 의 약자로 '지금 필요 없는 기능을 만들지 말라!' - 소프트웨어에 대한 요구는 매일매일 변한다.미리 예측하고 구현해도, 이러한 예측은 대부분 맞지 않다.예측에 들어맞이 않는 로직은 데드 코드가 된다.    3. 매직 넘버class ComicManager{ //생략 boolean isOk(){ return 60    - 설명이 없는 숫자는 개발자를 혼란스럽게 만든다.  class ComicManager{ /** 체험 구독 소비 포인트 */ private static final int TRIAL_READING_POINT = 60; ..

[내 코드가 그렇게 이상한가요?] 8장 강한 결합: 복잡하게 얽혀서 풀 수 없는 구조

1. 단일 책임 원칙- '클래스가 담당하는 책임은 하나로 제한해야 한다'는 설계 원칙  [문제 코드]DiscountManager 클래스가 Product클래스 대신 값을 확인하는 행위->  DiscountManager는 다른 클래스에게 책임을 지우지 않고 무엇이든 대신 해주는, 즉 과보호하는 부모 class DiscountManager{ List discountProducts; int totalPrice; //상품 추가 메서드 boolean add(Product product, ProductDiscount productDiscount){ ... } //할인 가격 확인 메서드 static int getDiscountPrice(int pr..