[Architecture] 헥사고날 아키텍처 (Hexagonal Architecture)
·
Backend/Architecture
1. 헥사고날 아키텍처란? 헥사고날 아키텍처는 2005년 앨리스터 코오번(Alistait Cockburn)이 제안한 소프트웨어 설계 패턴으로, 포트와 어댑터(Ports and Adapters) 아키텍처라고도 불린다. 핵심 아이디어는 애플리케이션의 핵심 로직(도메인)을 외부 세계와 완전히 분리하는 것이다. 가장 중요한 것은 의존성 방향이다. 모든 의존성은 바깥에서 안쪽(코어)을 향하며, 코어는 절대 바깥을 의존하지 않는다. 이를 위해 아웃바운드 포트는 코어가 인터페이스를 정의하고 어댑터가 이를 구현하는 의존성 역전(DIP)을 사용한다.구성 요소코어(Core / 도메인) : 순수한 비즈니스 로직으로, 외부 기술에 대해 아무것도 모른다. 육각형 안쪽에 위치한다.포트(Port) : 코어가 외부와 소통하기 위해 ..
[Architecture] BFF(Backend for Frontend) (feat. GraphQL)
·
Backend/Architecture
1. BFF란? Backend for Frontend의 약자로, 특정 프론트엔드를 위해 만들어진 전용 백엔드를 의미한다. 일반적인 구조에서는 여러 프론트엔드가 하나의 백엔드를 같이 사용한다.웹 ────┐모바일 ─┼→ 공용 백엔드관리자 ─┘ BFF 구조에서는 각 프론트엔드 앞에 전용 백엔드를 둔다.웹 ─────→ 웹 BFF ────┐모바일 ─→ 모바일 BFF ──┼→ 실제 백엔드 서비스관리자 ─→ 관리자 BFF ──┘ 이렇게 전용 백엔드가 필요한 이유는, 웹과 모바일이 같은 상품을 보여주더라도 필요한 데이터가 다를 수 있기 때문이다. 웹 화면에는 다음 정보가 모두 필요할 수 있다.상품 설명, 큰 이미지 여러 장, 리뷰 목록, 추천 상품, 판매자 정보반면 모바일 화면에는 핵심 정보만 필요할 수 있다.상품 이..
[모던 자바 인 액션] Chapter 4 | 스트림 소개
·
JAVA
Chapter 4. 스트림 소개컬렉션데이터를 그룹화하고 처리컬렉션 내에서 완벽한 연산은 아직 지원하지 않음4.1 스트림이란 무엇인가?스트림을 간단히 알아보자선언형으로 컬렉션 데이터를 처리할 수 있다.루프와 if 조건문 등의 제어 블록을 사용할 필요가 없다.멀티스레드 코드를 구현하지 않아도 데이터를 투명하게 병렬로 처리할 수 있다.여러 빌딩 블록 연산을 연결해서 복잡한 데이터 처리 파이프라인을 만들 수 있다.filter 메서드의 결과는 sorted 메서드로, sorted 메서드의 결과는 map 메서드로, map 메서드의 결과는 collect로 연결된다.스트림을 사용하지 않은 코드 (자바7)List lowCaloricDishes = new ArrayList();for(Dish dish: menu) { ..
[모던 자바 인 액션] Chapter 3 | 람다 표현식
·
JAVA
Chapter 3. 람다 표현식3.1 람다란 무엇인가?람다 표현식메서드로 전달할 수 있는 익명 함수를 단순화한 것이름은 없지만, 파라미터 리스트, 바디, 반환 형식, 발생할 수 있는 예외 리스트는 가질 수 있음람다의 특징익명함수메서드처럼 특정 클래스에 종속되지 않으므로 함수라고 부름전달람다 표현식을 메서드 인수로 전달하거나 변수로 저장 가능간결성람다 코드 예시기존 코드Comparator byWeight = new Comparator() { public int compare(Apple a1, Apple a2) { return a1.getWeight().compareTo(a2.getWeight()); }}람다를 이용한 코드Comparator byWeight = (Apple a1,..
[모던 자바 인 액션] Chapter 2 | 동작 파라미터화 코드 전달하기
·
JAVA
2.0 동작 파라미터화 간보기 아직 어떻게 실행할 것인지 결정하지 않은 코드 블록자주 바뀌는 요구사항에 효과적으로 대응할 수 있음 2.1 변화하는 요구사항 대응하기녹색 사과 필터링// filterApplesByColor(List inventory) 함수 내부if (GREEN.equals(apple.getColor())) { result.add(apple);}근데 만약 녹색 사과 말고 빨간 사과도 필터링하고 싶다면?메서드를 복제해서 빨간 사과 전용 메서드를 만든다⇒ 거의 비슷한 코드가 반복 존재한다면 그 코드를 추상화한다.색을 파라미터화// filterApplesByColor(List inventory, Color color) 함수 내부if (apple.getColor().equals(color)) ..
[DDD] Domain Driven Design 실습 - java
·
Backend
📋 미션 목록 1-1MoneyBigDecimal amount + Currency 필드 / 음수 금지 (compact constructor 검증) / 정적 팩토리 krw(long won) / isPositive() 메서드1-2CardNumber숫자 16자리(\d{16})만 허용 / masked() — 첫 4자리 + 가운데 마스킹 + 마지막 4자리1-3PaymentStatusString "PENDING"/"PAID"/"REFUNDED" → enum으로 변경2Payment생성자 (orderId, Money, CardNumber) → PENDING으로 시작 / pay() PENDING→PAID + paidAt 기록 / refund() PAID→REFUNDED / 잘못된 상태 전이 시 IllegalStateEx..
[DDD] Domain Driven Design 기초
·
Backend
1. 우리가 흔히 짜는 코드의 문제 Anemic Domain Model (빈약한 도메인 모델)Order 클래스를 열어보면 필드와 getter/setter밖에 없음. 즉 데이터 컨테이너(DTO)일 뿐, "주문은 어떻게 행동하는가"에 대한 로직이 전혀 없음.본질적으로 객체지향이 아니라 절차지향임. 데이터는 객체에, 로직은 서비스에 분리되어 있으니까.Martin Fowler가 'Anti-pattern'이라고 명시적으로 말한 패턴임.Fat Service (뚱뚱한 서비스)모든 비즈니스 로직이 OrderService로 몰림. 한 메서드가 수백 줄, 클래스가 수천 줄까지 자라남.트랜잭션 시작 -> 검증 -> 계산 -> 외부 호출 -> 상태 변경 -> 저장이 한 메서드 안에 다 들어있음.결과적으로 무엇이 비즈니스 규칙..
[AI·SW 마에스트로] 17기 합격 후기
·
AI·SW 마에스트로
AI·SW 마에스트로 서울센터 17기에 합격했다!!! 1차 - 서류 전형, 2차 - 1차 코딩테스트, 3차 - 2차 코딩테스트, 4차 - 심층면접의 과정을 거쳐 합격하게 되어서,기록해두면 소마를 준비하시는 분들께도, 미래의 나에게도 도움이 많이 될 것 같아 후기를 써보게 되었다! 서류전형서류 전형은 필수 2문항 선택 1문항이었고, 아래와 같았다. 1. (*필수) [자기소개] AI 및 SW분야의 전문성을 키우기 위해 몰입했던 경험과 도전이 무엇인지, 또한 이러한 성장과정을 통해 얻은 배움은 무엇인지를 서술하여 주시기 바랍니다.(최소 400자, 최대 1000자 입력가능)2. (*필수) [연수계획서] AI·SW마에스트로 과정 참여를 통해 어떠한 프로젝트를 수행하고 싶은가요? 해당 프로젝트를 수행하기 위한 계..
[Git/GitHub] 협업 초보자를 위한 Git/GitHub 첫 사용법!
·
카테고리 없음
이번 UMC 9기에 운영진을 맡게 되면서 협업이 처음인 동아리원들을 위해 원디랑 깃/깃허브 미미나를 준비해봤다!준비하며 정리했던 내용들을 아래 작성 후 마지막에 미미나 후기를 짧게 써보겠다!! 1. 깃(Git)과 깃허브(GitHub) 관계Git 이란?Git은 분산 버전 관리 시스템(DVCS)으로, 파일의 변경 이력을 추적하고 여러 사람과 협력하여 작업할 수 있도록 돕는 도구이다.Git을 사용하면 프로젝트의 소스 코드나 문서 등의 변화를 기록하고, 언제든지 과거의 특정 시점으로 되돌릴 수 있다.또한, 분산 저장소를 기반으로 하기 때문에, 모든 사용자는 프로젝트의 전체 히스토리를 로컬에 저장하고 있어 인터넷 연결 없이도 작업이 가능합니다. GitHub란?GitHub는 Git을 기반으로 한 웹 호스팅 서비스로..
[BOJ/Python] 2211번: 네트워크 복구 | 다익스트라 알고리즘
·
Program Solving/Python
https://www.acmicpc.net/problem/2211 문제N(1 ≤ N ≤ 1,000)개의 컴퓨터로 구성된 네트워크가 있다. 이들 중 몇 개의 컴퓨터들은 서로 네트워크 연결이 되어 있어 서로 다른 두 컴퓨터 간 통신이 가능하도록 되어 있다. 통신을 할 때에는 서로 직접 연결되어 있는 회선을 이용할 수도 있으며, 회선과 다른 컴퓨터를 거쳐서 통신을 할 수도 있다.각 컴퓨터들과 회선은 그 성능이 차이가 날 수 있다. 따라서 각각의 직접 연결되어 있는 회선을 이용해서 통신을 하는데 걸리는 시간이 서로 다를 수 있다. 심지어는 직접 연결되어 있는 회선이 오히려 더 느려서, 다른 컴퓨터를 통해서 통신을 하는 것이 더 유리할 수도 있다. 직접 연결되어 있는 회선을 사용할 경우에는 그 회선을 이용해서 통..