지난 게시글에서, 웹 서버와 WAS에 대해 알아봤다. 웹 서버와 WAS Web Server와 WAS(Web Application Server)에 대해 알아보도록 하자. 이들을 설명하기 앞서, 이 둘의 차이를 이해하기 위해 정적 페이지와 동적 페이지의 차이부터 알아보자. 📄 정적 페이지와 동적 페이지 xxeol.tistory.com 이를 더 잘 이해하기 위해서는 Reverse Proxy 개념에 대해서 알아야한다. 이번 게시글에서는 프록시(Proxy) 서버란 무엇인지, 그리고 프록시 서버의 두가지 유형인 Forward Proxy / Reverse Proxy에 대해 알아보도록 하자. 프록시(Proxy)란? 프록시(Proxy)는 클라이언트와 서버 간의 통신을 중계하는 역할을 하는 서버나 소프트웨어이다. 클라이언..
Web Server와 WAS(Web Application Server)에 대해 알아보도록 하자. 이들을 설명하기 앞서, 이 둘의 차이를 이해하기 위해 정적 페이지와 동적 페이지의 차이부터 알아보자. 📄 정적 페이지와 동적 페이지 정적 페이지 (Static Pages) 정적 페이지는 미리 작성된 내용이 고정되어 있으며, 요청에 따라 동일한 내용을 제공한다. 이는 정적 콘텐츠(HTML, CSS, JavaScript, 이미지 등)로 구성되며, 파일 시스템에 저장되어있다. 내용이 변경되지 않거나 변경 주기가 적은 경우에 사용된다. 정적 페이지는 웹 서버에 의해 처리되며, 클라이언트의 요청에 따라 해당 파일을 그대로 전송하여 보여준다. 동적 페이지 (Dynamic Pages) 동적 콘텐츠는 클라이언트의 요청에 따..
헥사고날 아키텍처(Hexagonal Architecture)는 다른 말로, 포트와 어댑터 아키텍처(Ports and Adapters Architecture)이다. 해당 아키텍처의 목표는 외부(외부 인터페이스나 인프라스트럭쳐)의 변경에 영향을 받지 않는 핵심 코드를 만들고 이를 견고하게 관리하는 것이다. 계층형 아키텍처(Layered Architecture)의 문제점 # DB 주도 설계 - 계층형 아키텍처는 DB Layer가 토대이다. 즉, DB 주도 설계로 이어질 가능성이 크다. - 이는 비즈니스 관점에서 적합하지 않다. - 도메인 로직과 영속성을 구분하여 설계하는 것이 어려워지며, 도메인 코드가 영속성 계층의 영향을 받을 가능성이 커진다. # 암묵적인 의존성 - 계층형 아키텍처에서는 동일 계층의 컴포넌..
레이어드 아키텍처(Layered Architecture)가 무엇인지 알아보자. 소프트웨어 아키텍처란? 소프트웨어 아키텍처란, 소프트웨어 시스템의 전체적인 구조와 구성요소들 간의 상호작용을 설계하는 것을 말한다. 쉽게 말해, 건축물의 뼈대를 잡는 것과 같은 과정이다. 건축물의 구조와 종류는 굉장히 다양하다. (철근 콘크리트, 철골, 목조, …) 어떤 자재를 사용하고, 해당 자재들을 어떻게 조립하는지에 따라 건축물의 특성은 크게 달라진다. 이와 같이 소프트웨어 아키텍처는 시스템의 전체적인 동작을 결정하고, 시스템의 품질 성능(성능, 확장성, 유지보수성, 보안 등)에 직접적으로 영향을 미친다. 소프트웨어 아키텍처를 선택할 때는 다양한 요소(요구사항, 복잡성, 기술 스택, 경험, 비용 및 시간 등)들을 고려하여..
최범균님의 프로그래밍 초식 - 지네릭 변성(java) 를 보고 정리한 글입니다. (출처: https://youtu.be/PtM44sO-A6g) 제너릭 예시 - List 자바에서 우리가 가장 쉽게 접하고 있는 제너릭 예시는 List 이다. 다음은 List 내부 구현이다. public interface List extends Collection { boolean add(E e); E get(int index); /***/ } List는 제너릭을 활용하기 때문에, 우리는 다양한 타입의 List를 선언할 수 있다. List messages = new ArrayList(); List users = new ArrayList(); 제너릭을 활용하면, 잘못된 타입의 값을 넣는 실수를 컴파일 타임에 예방을 해준다. 아래..
체스 미션에서 전략패턴을 도입하면서 다음과 같은 클래스 상속 구조를 갖추게되었다. https://xxeol.tistory.com/22 [체스 미션] 상속 대신 전략패턴 도입하기 나는 체스 미션의 설계를 아주 많이 갈아엎었다.. 대공사가 정말 많았다. 한 4-5번 정도? (이 과정은 다른 포스팅에서 기록해두려고 한다.) 오늘은 상속으로 이루어져있던 코드를 전략패턴을 도입 xxeol.tistory.com 여기서 한 가지 문제점이 있다. public class Piece { protected final Color color; protected final PieceType type; public Piece(Color color, PieceType type) { validateColor(color); this.c..
나는 체스 미션의 설계를 아주 많이 갈아엎었다.. 대공사가 정말 많았다. 한 4-5번 정도? (이 과정은 다른 포스팅에서 기록해두려고 한다.) 오늘은 상속으로 이루어져있던 코드를 전략패턴을 도입해 조합으로 바꾼 대공사에 대해 설명하고자 한다. 기존의 코드(step1)에서, 나는 Piece라는 추상 클래스를 상속하는 방법으로 각 기물들을 구현했다. Piece라는 추상클래스가 있고, 기물별로 구현체가 존재했다. 하지만 해당 코드에서 한가지 찜찜한 점이 있었다. public class Bishop extends Piece { /***/ @Override public PieceType getType() { return PieceType.BISHOP; } } 그것은 바로 위와 같이 getType 함수를 통해 해당..
사용자가 입력한 이름 순서대로 플레이어의 카드를 보여줘야하는 요구사항이 있다. 해당 요구사항을 만족시키기 위해 어떤 코드를 작성할 수 있을까? 플레이어 리스트를 맵으로 변환하면 되지 않을까? public Map getPlayerToCard(List players) { return players.stream() .collect(Collectors.toMap(Player::getName, Player::getCards)); } 위와 같이 코드를 작성했고, 위의 코드에서는 stream으로 List를 순회하며 map으로 바꾸어준다. 우리는 당연히 요구사항에 맞는 결과값을 예상한다. 예상이 맞을까? 한 번 출력해 확인해보자. 아쉽게도 순서가 지켜지지 않았다. 그 이유는 무엇일까? Collectors.toMap 구..