01. UML (Unified Modeling Language) 개요 및 필요성
UML이란 시스템을 시각적으로 표현하기 위한 표준화된 모델링 언어, 문서화, 기획을 의미한다. 즉, UML이란 소프트웨어 개발 과정에서 복잡한 구조나 동작을 그림으로 표현함으로써 설계의 이해도와 팀원들 간 의사소통을 향상시키는 도구를 뜻한다. 이러한 UML은 구조(Struct)와 동적 행동(Behavior)을 모두 다룰 수 있다.
1. UML을 사용하는 이유
| UML 사용 이유 | |
| 시각적 이해 | 복잡한 시스템을 시각적인 그림으로 표현함으로써 직관적인 이해를 도움 |
| 팀 간 소통 및 협업 향상 | 개발자, 기획자, 디자이너, QA 등 다양한 직군이 이해할 수 있는 공통 언어 역할 수행 |
| 설계 오류 조기 발견 | 코드 작성 전, 구조를 검증하여 논리적인 오류나 중복 설계 조기 발견 가능 |
| 유지보수 용이성 증가 | 설계 문서의 역할을 수행하므로, 새로운 개발자가 프로젝트에 개발할 때 용이 |
2. UML의 목적과 주요 특징
| 사용 목적 | |
| 구조 시각화 | 클래스, 객체, 패키지 등 시스템의 구성 요소를 표현 |
| 동작 시각화 | 시퀀스, 상태, 활동 등 객체 간 상호작용을 표현 |
| 명세 (Specification) |
개발자 간 공통 이해를 위해 동작 및 구조를 명확히 정의 |
| 문서화 (Documentation) |
유지보수와 협업을 위한 설계 문서 역할 수행 |
3. UML을 배워야 하는 이유
| UML을 배워야 하는 이유 | |
| 빠른 코드 구조 이해 | 시스템 구조를 한 눈에 파악 가능 >> 클래스와 클래스의 역할 / 사용하는 객체 / 프로그램의 흐름 등 |
| 객체 지향 설계 능력 향상 | UML은 객체 지향 사고를 훈련하는 도구의 역할 수행 >> 객체 및 관계 정의 |
| 설계 문제를 코드 작성 이전에 해결 | 코드 작성 이후 수정하는 비용 절감 |
4. UML의 기본 구성 요소
| 구성 요소 | ||
| 클래스 (Class) |
객체의 설계도 | 이름 / 속성 / 메서드 |
| 객체 (Object) |
클래스의 인스턴스 | "instance : Class" |
| 관계 (Relationship) |
클래스 간 연결 | Association, Dependency 등 |
| 패키지 (Package) |
클래스 그룹화 | 폴더 또는 네임스페이스 |
5. UML의 종류
| UML의 종류 | |
| 구조 다이어그램 (Struct Diagram) |
클래스 다이어그램, 객체 다이어그램, 패키지 다이어그램, 컴포넌트 다이어그램 |
| 행위 다이어그램 (Behavior Diagram) |
시퀀스 다이어그램, 활동 다이어그램, 상태 다이어그램 |
02. 클래스 다이어그램 (Class Diagram)
클래스 다이어그램이란 객체 지향 시스템의 정적 구조를 시각적으로 표현하는 UML 다이어그램으로, 클래스, 속성, 메서드, 객체 간의 고나계를 표현한다.
1. 접근 제어자 표기
| 접근 제어자 | 기호 | |
| public | + | 어디서든 접근 가능 |
| private | - | 클래스 내부에서만 접근 가능 |
| protected | # | 상속 관계에서 접근 가능 |
| package | ~ | 동일 패키지에서만 접근 |
-----------------------
| User |
-----------------------
| - name: String |
| - age: int |
-----------------------
| + login(): void |
| + logout(): void |
-----------------------
2. 클래스 간 관계 표현
| 관계 | UML 표기 | |
| 연관 (Association) |
두 클래스가 서로를 알고 있는 일반적인 관계 | 실선 |
| 의존 (Dependency) |
한 클래스가 다른 클래스를 일시적으로 사용하는 관계 | 점선 화살표 |
| 집합 (Aggregation) |
전체 - 부분의 느슨한 포함 관계 >> 생명주기 독립적 |
빈 마름모 |
| 합성 (Composition) |
전체 - 부분의 강한 포함 관계 >> 생명주기 공유 |
채워진 마름모 |
| 일반화 (Generalization) |
상속 관계 | 빈 삼각형 화살표 |
| 구현 (Realization) |
인터페이스 구현 | 점선 + 빈 삼각형 |
3. 다중성(Multiplicity) 표기
| 표기 | |
| 1 | 정확히 1개 |
| 0..1 | 최대 1개 |
| * | 0개 이상 |
| 1..* | 최소 1개 이상 |
// 1-1. 연관 관계 (일대일)
public class User {
private Order order;
}
// 1-2. 연관 관계 (일대다)
public class User {
private List<Order> orders;
}
// 2. 의존 관계
public class OrderService {
public void createOrder(User user) {
// user 객체를 잠깐 사용
}
}
// 3. 집합 관계
public class Team {
private List<Player> players; // players는 다른 곳에서도 사용될 수 있음
}
// 4. 합성 관계
public class House {
private List<Room> rooms = new ArrayList<>();
}
// 5. 일반화 관계
public class Animal {}
public class Dog extends Animal {}
// 6. 구현 관계
public interface Payment {
void pay();
}
public class CardPayment implements Payment {
@Override
public void pay() { }
}
03. 시퀀스 다이어그램 (Sequence Digram)
시퀀스 다이어그램이란 시간의 흐름에 따라 객체 간에 오가는 메시지(메서드 호출)를 표현하는 UML 다이어그램이다. 이러한 시퀀스 다이어그램은 객체 수가 증가하면 복잡해질 위험성이 있으므로, 핵심 협력자 객체를 중심으로 작성한다.
1. 시퀀스 다이어그램 사용 이유
| 사용 이유 | 주요 장점 및 특징 | 기대 효과 (Benefit) |
| 흐름 파악 | 시간 흐름(Time Sequence) 기준의 로직 구성 | 복잡한 비즈니스 로직을 순차적으로 쉽게 이해 가능 |
| 구조 시각화 | 객체 간 협력 구조를 명확하게 표현 | 어떤 객체가 어떤 메시지를 주고받는지 한눈에 파악 |
| 의사소통 | 팀 설계 논의 시 강력한 커뮤니케이션 도구 | 개발자, 기획자, 설계자 간의 기술적 간극 해소 및 필수 문서화 |
| 문서화 | 서비스 및 API 호출 흐름 기록 | 시스템의 전체적인 트랜잭션 과정을 표준화된 형태로 보존 |
| 품질 개선 | 비효율적인 협력 구조 조기 발견 | 디버깅 및 리팩토링 시 병목 구간이나 불필요한 호출 감지 용이 |
2. 기본 구성 요소
| 구성 요소 | UML 표기 | |
| Lifeline (생명선) |
객체 또는 참여자 | 가로축 >> 세로축으로 내려가며 시간의 흐름을 표현 |
| Message (메시지) |
객체 간 전달되는 메서드 호출 또는 응답 | 실선 화살표 / 점선 화살표 |
| Activation Bar (활성화 바) |
해당 객체가 작업을 수행 중임을 나타냄 |
3. 메시지 종류
| 메시지 유형 | 표현 | |
| 동기 호출 | A->>B | A가 B를 호출하고 응답을 기다림 |
| 비동기 호출 | A->B | A가 B를 호출하지만 응답을 기다리지 않음 |
| 반환 메시지 | B-->>A | B가 처리 후 A에게 결과를 반환 |
4. 시퀀스 다이어그램 예시 | 사용자 로그인 과정
public class AuthController {
private final AuthService authService;
public LoginResponse login(LoginRequest request) {
User user = authService.authenticate(request.getId(), request.getPw());
return new LoginResponse(user.getName(), "SUCCESS");
}
}
public class AuthService {
public User authenticate(String id, String pw) {
User user = userRepository.findById(id);
if (!user.getPassword().equals(pw)) {
throw new IllegalArgumentException("wrong password");
}
return user;
}
}
sequenceDiagram
autonumber
participant U as User
participant C as AuthController
participant S as AuthService
participant R as UserRepository
U->>C: login(id,pw)
C->>S: authenticate(id,pw)
S->>R: findById(id)
R-->>S: User
S-->>C: authenticated User
C-->>U: LoginResponse(SUCCESS)

5. 시퀀스 다이어그램 예제 | 주문 생성
public class OrderController {
private final OrderService orderService;
public OrderResponse order(CreateOrderRequest req) {
Order order = orderService.createOrder(req);
return new OrderResponse(order.getId(), "OK");
}
}
sequenceDiagram
autonumber
participant C as OrderController
participant S as OrderService
participant P as PaymentService
participant R as OrderRepository
C->>S: createOrder(req)
S->>P: pay(req.paymentInfo)
P-->>S: paymentResult
S->>R: save(order)
R-->>S: saved order
S-->>C: OrderResponse

04. UML 작성 틀
1. 대표 UML 도구 비교
| Merimaid | Draw.io | PlantUML | |
| 방식 | 코드 기반 | 드래그 & 드래그 드롭 GUI | 코드 기반 |
| 난이도 | 쉬움 | 매우 쉬움 | 어려움 |
| 설치 여부 | 불필요 | 불필요 | 필요 또는 서버 |
| 협업 | 우수 >> Notion / Github 지원 |
보통 | 우수 |
| 문서 버전 관리 | 우수 | 어려움 | 우수 |
| 복잡도 표현 | 보통 | 높음 | 매우 높음 |
| 장점 | 직관적 / 버전 관리 용이 | 직관적 / 시각화 강력 | 복잡한 다이어그램 표현력 용이 |
| 단점 | 복잡한 다이어그램은 난이도 높음 | 버전 관리 어려움 | 설정 난이도 높음 |
| 사용 상황 | 문서 기반 협업 | 즉석 설계 | SI / 공공기관 / 대규모 설계 문서 |
2. Mermaid 예시






3. Mermaid 예시 | 사용자 로그인

4. Drow.io 예시
1. <https://app.diagrams.net> 접속
2. New Diagram 클릭
3. UML 카테고리 선택
4. Class Diagram 템플릿 선택
5. 드래그하여 클래스/관계 배치
6. 저장: PNG/SVG/PDF
5. PlantUML 예시
@startuml
class User {
- name: String
- age: int
+ login(): void
+ logout(): void
}
@enduml
'[Codeit Review] > 객체 지향 프로그래밍' 카테고리의 다른 글
| [05] 예외 처리 (Exception Handling) (0) | 2026.01.26 |
|---|---|
| [04] 내부 클래스와 익명 클래스, 그리고 열거 타입(ENUM)의 활용 (0) | 2026.01.26 |
| [03] SOLID 원칙 (0) | 2026.01.26 |
| [02] 객체 지향 프로그래밍의 4가지 핵심 개념 (0) | 2026.01.26 |
| [01] 객체 지향 프로그래밍 (0) | 2026.01.16 |