본문 바로가기

전체 글

(31)
2023 회고 벌써 올 한해가 가고 오늘은 12/31 마지막 날이다. 블로그에 소홀하기도 했고, 개인적으로 생각 정리도 할 겸 글을 적어보려 한다. 글 잘 쓰시는 다른 분들에 비해 그닥 재미와 감동은 덜 하겠지만, 이것 또한 일기처럼 기록돼서 '그땐 그랬지~' 정도가 될 듯 하다. 결론부터 말하면 올 한해도 고생 많았다. 작년처럼 불안하고 마음속으로 많이 헤맸지만, 작년처럼 노력했고 성장했다. 작년과 다른 점이 있다면 고민의 깊이가 달라졌다는 점과 내 위치, 그리고 내 위치를 자각하고 있다는 메타인지 향상... 정도 이제는 초심자와 다르게 '소프트웨어로 세상을 바꾼다'(ㅋㅋ)와 같은 거창한 생각은 하지 않는다. 세상은 경제, 정치, 사회적 이슈로 인해 훨씬 더 복잡하게 흘러간다. 작년 여름부터 시작된 금리인상도 그렇고..
팀 프로젝트를 진행하며 겪었던 트레이드 오프 사례들 팀 프로젝트를 진행하며 내가 겪었던 몇 가지 트레이드 오프 사례들을 회고해보자. 사례 1: embedded 객체 사용 팀 내에서 객체지향 생활체조 원칙 중 규칙 6: 모든 엔티티를 작게 유지한다 규칙 7: 3개 이상의 인스턴스 변수를 가진 클래스를 쓰지 않는다 를 반영하여 embedded 객체를 적극적으로 도입하기로 했다. 내가 맡은 도메인은 주문이었는데, 예를 들면 Order 엔티티 클래스 내에 주문번호, 접수번호 등의 필드를 OrderInfo라는 embedded 객체로 분리하는 방식이었다. @Entity public class Order extends BaseTimeEntity { // 생략 @Embedded private OrderInfo orderInfo; } @Embeddable public c..
스프링 컨테이너와 IoC 바우처 미션을 진행하면서 근본적인 궁금증이 생겼다. 왜 의존성 주입을 받아야하지? java의 다형성을 통해 충분히 유연한 코드를 작성할 수 있고, 객체 간의 역할을 나눠서 수행하는 거라면 그냥 객체를 생성해서 할 수 있지 않을까? VoucherConfig voucherConfig = new VoucherConfig(); CommandHandler commandHandler = voucherConfig.commandHandler(); VoucherRepository voucherRepository = voucherConfig.voucherRepository(); 이제 Bean으로 등록해 사용해보자. ApplicationContext context = new AnnotationConfigApplication..
Java의 constant pool Constant Pool은 Java의 메모리 영역 중 하나로, String 리터럴들이 저장되는 풀이다. String 리터럴은 코드에 직접 작성된 문자열을 의미하며, 메모리 내에서 재사용될 수 있도록 관리된다. 따라서 같은 리터럴 값을 가지는 String 변수들은 Constant Pool 내에서 같은 객체를 참조하게 된다. 예를 들어, 다음과 같은 코드에서 String a = "hello world"; String b = "hello world"; 위의 경우, "hello world"라는 리터럴은 Constant Pool에 저장되며, 변수 a와 b는 같은 String 객체를 참조하게 된다. 따라서 a == b는 true다. 그러나, 다음과 같이 String 객체를 연결하는 경우에는 새로운 String 객체..
DNS 서버는 어떻게 도메인이름을 IP주소로 변환할까? DNS(Domain Name System)는 인터넷에서 도메인 이름과 IP 주소를 연결하여 네트워크 통신을 가능하게 하는 시스템이다. DNS는 도메인 이름을 IP 주소로 변환하여 통신에 사용한다. DNS 테이블 DNS 테이블은 DNS 서버에서 사용되는 데이터베이스이다. DNS 서버는 도메인 이름에 해당하는 IP 주소 정보를 DNS 테이블에 저장하고, 도메인 이름을 검색하면 DNS 테이블에서 해당 도메인 이름에 대한 IP 주소 정보를 찾아서 요청자에게 제공한다. DNS 테이블은 일반적으로 DNS 서버의 캐시(Cache)에 저장되어 빠르게 검색이 가능하다. ISP ISP(Internet Service Provider)는 인터넷 서비스 제공 업체를 의미한다. ISP는 일반 가정이나 회사에 인터넷 서비스를 제공..
대용량 트래픽 처리를 위한 자바의 핵심 기술 멀티스레딩 한 번에 하나의 작업만 처리하는 단일 스레드보다 여러 작업을 동시에 처리할 수 있어서 성능 향상을 기대할 수 있다. I/O 작업을 수행할 때, 대기 시간이 발생하므로 스레드를 대기 상태로 만들고 다른 작업을 수행할 수 있어서, I/O 작업을 효율적으로 처리할 수 있다. 멀티스레딩을 사용하면, 하나의 스레드에서 여러 작업을 처리하므로 작업을 분산시키고 병렬 처리할 수 있다. 이렇게 분산 처리하면, 전체 작업 시간이 감소하여 성능 향상을 가져올 수 있다. 또한, 시스템이 더 많은 클라이언트 요청을 처리할 수 있어서 서버 확장성을 높일 수 있다. public class MyThread extends Thread { @Override public void run() { // 스레드에서 실행될 코드 작..
CORS에 대해 알아보자 SOP, Same Origin Policy 브라우저에서는 보안적인 이유로 cross-origin HTTP 요청들을 제한한다. 그래서 cross-origin 요청을 하려면 서버의 동의가 필요하다. 만약 서버가 동의한다면 브라우저에서는 요청을 허락하고, 동의하지 않는다면 브라우저에서 거절한다. 이러한 허락을 구하고 거절하는 메커니즘을 HTTP-header를 이용해서 가능한데, 이를 CORS(Cross-Origin Resource Sharing)라고 부른다. 브라우저는 SOP(Same Origin Policy)를 적용하여 다른 출처(Origin)의 리소스에 대한 접근을 제한한다. 이는 보안 상의 이유로 중요하다. 하지만 때로는 다른 출처의 리소스에 접근해야 하는 경우가 있다. 이 때 CORS를 사용하여 다른 ..
메시지 큐는 어떻게 동작할까? 메시지 큐(Message Queue)는 비동기식 통신 패턴의 일종으로, 송신자와 수신자가 데이터를 전송하고 받을 때 사용된다. 메시지 큐는 송신자가 데이터를 메시지 큐에 추가하면, 이를 수신자가 읽을 준비가 될 때까지 대기시키며, 수신자는 메시지 큐에서 데이터를 가져와 처리한다. 메시지 큐는 보통 다음과 같은 세 가지 요소로 이루어져 있다. Producer: 데이터를 생산하는 역할을 수행하는 프로세스나 애플리케이션이다. Queue: 데이터가 저장되는 장소로, FIFO(First-In-First-Out) 방식으로 데이터를 처리한다. Consumer: 데이터를 소비하는 역할을 수행하는 프로세스나 애플리케이션이다. 메시지 큐는 비동기식으로 동작하기 때문에, Producer와 Consumer는 서로 독립적으로 ..