1. 목표

개요의 목표는 다음 4가지를 이해하는 것

  1. 소프트웨어 아키텍처란 무엇인가
  2. 왜 중요한가
  3. 소프트웨어 아키텍처의 일반적인 정의
  4. 소프트웨어 개발 전체 과정에서 어디에 위치하는가

2. 소프트웨어 아키텍처를 이해하는 직관적 비유

모든 것은 구조(Structure)를 가진다

우리가 만드는 모든 것에는 구조가 존재한다.

  • 미리 설계된 구조일 수도 있음
  • 즉흥적으로 만들어진 구조일 수도 있음
  • 하지만 구조는 항상 존재함

구조는 시간이 지나면 바꾸기 어려워진다

어떤 시스템이든:

  • 만들기 위해 많은 노력을 들일수록
  • 나중에 구조를 변경하는 비용이 커짐

즉:

  • 초기 구조 설계가 매우 중요함

3. 구조가 중요한 이유

구조는 제작 의도(Intent)를 반영한다

구조는 단순한 형태가 아니라:

  • "무엇을 위해 만들어졌는가"
  • "어떤 품질을 갖는가"

를 결정한다.


건축물 비유

극장(Theater)

목적:

  • 공연 관람

특징:

  • 공연 관람에는 최적
  • 거주나 업무에는 부적합

집(House)

목적:

  • 생활 공간

특징:

  • 거주에는 적합
  • 공연 개최에는 부적합

소프트웨어에도 동일한 원리 적용

같은 기능이라도:

  • 코드를 작성하는 방식은 무한함
  • 설계 구조에 따라 결과가 달라짐

4. 소프트웨어 아키텍처가 결정하는 것

소프트웨어 아키텍처는 시스템의 핵심 특성을 결정한다.

영향을 주는 요소:

  • 성능
  • 확장성(Scalability)
  • 규모 처리 능력
  • 유지보수성
  • 기능 추가 용이성
  • 오류 대응 능력
  • 보안 대응 능력

잘못 설계된 구조의 문제

초기 구조가 잘못되면:

  • 재설계 비용 증가
  • 시간 낭비
  • 큰 시스템일수록 비용 폭증

5. 소프트웨어 아키텍처의 정의

정의

소프트웨어 아키텍처란
높은 수준의 시스템 구조 개념이며
구성 요소 간 관계를 표현하고
시스템 요구사항과 제약사항을 만족시키는 것


6. 정의를 구성 요소별로 해석


1) 높은 수준의 시스템 구조 (High-Level Structure)

의미:

  • 추상화(Abstraction)
  • 중요한 구조만 표현
  • 세부 구현은 제외

포함되는 것

  • 시스템의 큰 구조
  • 주요 컴포넌트
  • 관계 흐름

포함되지 않는 것 (오해를 많이 하니 주의)

  • 프로그래밍 언어
  • 프레임워크
  • 특정 기술 스택
  • 코드 구현 방식

매우 중요한 오해

많은 엔지니어가:

"기술 선택 = 아키텍처"

라고 생각함

하지만 이는 잘못된 생각.


아키텍처 ≠ 기술 선택

기술은:

  • 구현 단계에서 선택 가능
  • 아키텍처 이후 결정될 수 있음

아키텍처는:

  • 설계 마무리 단계에서 선

2) 구성 요소(Component)와 관계(Relationship)

구성 요소란:

  • 블랙박스(Black Box)
  • 특정 행동(API)을 가진 단위

구성 요소 예시

  • 사용자 인증 서비스
  • 결제 서비스
  • 데이터 저장 서비스
  • 메시징 시스템

핵심

중요한 것은:

  • 구성 요소 자체보다
  • 서로 어떻게 연결되는가

재귀적 구조 가능

구성 요소 하나가:

  • 내부적으로 또 다른 아키텍처를 가질 수 있음

즉:

  • 시스템 안에 작은 시스템 존재 가능

3) 요구사항(Requirements)과 제약조건(Constraints)

아키텍처는 반드시 다음을 만족해야 함.


요구사항

시스템이 해야 하는 것

예:

  • 로그인 기능
  • 결제 기능
  • 대용량 처리

제약조건

시스템이 하면 안 되는 것

예:

  • 개인정보 외부 노출 금지
  • 특정 응답시간 제한
  • 특정 보안 정책 준수

7. 소프트웨어 아키텍처의 추상화 레벨

아키텍처는 여러 단계로 존재함.


낮은 수준 추상화

  • 클래스(Class)
  • 구조체(Struct)
  • 객체(Object)

중간 수준 추상화

  • 모듈(Module)
  • 패키지(Package)
  • 라이브러리(Library)

높은 수준 추상화 (강의 중심)

특징

  • 서비스 단위 (개별의 구성요소들은 별도의 서비스로 존재)
  • 분산 시스템
  • 여러 컴퓨터에서 개별 혹은 그룹으로 분산 실행

8. 대규모 시스템 아키텍처

강의에서 다루는 대상:

  • 대규모 시스템
  • 분산 구조
  • 멀티 서비스 시스템

장점

처리량 증가

  • 더 많은 요청 처리

데이터 확장

  • 대량 데이터 처리 가능

사용자 확장

  • 수천~수만 사용자 대응

대표 사례

  • 차량 공유 서비스
  • VOD 플랫폼
  • SNS
  • 온라인 게임
  • 금융 서비스

9. 설계 실패의 위험성

좋은 설계:

  • 스타트업 → 대기업 성장 가능
  • 글로벌 서비스 가능

나쁜 설계:

  • 몇 달 개발 후 실패
  • 사용자 요구 미충족
  • 재개발 필요

핵심 메시지

잘못된 시스템을 다시 만드는 것은:

  • 매우 어렵고
  • 매우 비싸다

이렇게 위험 부담이 크다는 것은 이 강의 과정에서 배울 내용이 매우 중요하다는 


10. 소프트웨어 개발 생명주기(SDLC)

소프트웨어 개발은 크게 4단계


1) 설계 (Design)

  • 구조 정의
  • 아키텍처 설계

2) 구현 (Implementation)

  • 코드 작성

3) 시험 (Testing)

  • 검증
  • 오류 발견

4) 배포 (Deployment)

  • 실제 운영

반복 구조

소프트웨어는 지속적으로 개선됨.

따라서:

  • 위 과정이 반복됨
  • 이 반복의 첫 번째 주기가 차후 반복에 크게 영향을 미침
  • 기존의 시스템에서 점진적으로 변화를 만듬

11. 소프트웨어 아키텍처의 위치

아키텍처는:

설계 단계의 결과물

그리고 동시에

구현 단계의 입력값


즉:

설계 → 아키텍처 생성 → 구현 시작


12. 설계 단계가 중요한 이유

설계 단계는:

  • 가장 중요함
  • 구현보다 먼저 결정됨
  • 팀 전체 방향을 결정함

특징

  • 수주 ~ 수개월 소요 가능
  • 여러 엔지니어 협업 필요

13. 소프트웨어 아키텍처가 어려운 이유

알고리즘은:

  • 정답 판단 가능

아키텍처는:

  • 정답이 없음
  • 좋고 나쁨 판단이 어려움

14. 좋은 아키텍처를 만드는 방법

좋은 설계를 위해서는:

  1. 체계적 설계 프로세스를 따름 (Methodical Design Process)
  2. 산업 검증 패턴 사용 (Architectural Patterns)
  3. 좋은 사례 학습하여 적용 (Best Practices)
  4. 경험 축적

15. 강의 핵심 요약


핵심 1

모든 시스템은 구조를 가진다.


핵심 2

구조는 시스템 성공을 결정한다.


핵심 3

소프트웨어 아키텍처는:

  • 높은 수준의 시스템 구조를 표현하는 것 
  • 요구사항 + 제약조건 만족하도록
  • 각기 다른 구성 요소의 관계를 표현한 것

핵심 4

아키텍처는:

  • 설계 결과물
  • 구현 입력값

핵심 5

좋은 구조는 미래 비용을 줄인다.


한 줄 핵심 정리

소프트웨어 아키텍처는
"어떤 기술을 쓰는가"가 아니라
"시스템을 어떤 구조로 만들 것인가"를 정의하는 설계 철학이다.

RHEL8의 WSL 환경을 구성 중에 RHEL8 이 내장되어있지 않아 docker 를 이용하여 tar.gz 를 추출하는 방법을 생각했다.

docker는 OS-level 가상화 애플리케이션이다. 이러한 의미로 Windows OS 에 docker 를 구동하면 Windows 기반의 GUI를 사용하는 것처럼 이해되는데, 내가 윈도우에서 docker desktop을 설치하여 사용하였을 땐 분명 linux 환경이었다.

그리하여 윈도우 기반 docker stack 에 대해 조사하게된 내용을 정리하였다.

 

Windows 기반 docker 아키텍처

 

Docker 엔진은 Linux 특정 커널 기능을 사용하는 데몬으로 실행된다. 따라서 Windows 에서 Docker 엔진을 직접 실행하는 것은 불가능하다. 따라서 docker를 실행하려면 Windows에서 Linux 기반 환경을 만들어야 한다. Windows에서 Linux 환경을 활성화하려면 두 가지 옵션이 있다.

1. Windows Subsystem for Linux(WSL) : 리눅스 애플리케이션을 실행하기 위한 호환성 레이어(compatibility layer)*
*호환성 레이어(compatibility layer) : 한 OS에서 구동되는 프로그램을 다른 OS에서 구동되도록 코드를 변환해주는 소프트웨어

2. Hyper-V: 가상화(virtualization)*를 위한 마이크로소프트 솔루션

* 가상화(virtualization): 크게 '격리'와 '공유' 개념이 적용된 기술. 가상 환경을 생성하여 컴퓨팅 환경 전체에 리소스를 분산함으로써 리소스를 보다 효율적으로 사용할 수 있게 해주는 기술

 

개념

Docker는 Hyper-V/WSL 아래의 Windows OS를 가상화하는 것이 아니라
Hyper-V/WSL 위에서 실행되는 Linux OS(kernel)를 기반으로 컨테이너를 가상화한다. 따라서 컨테이너들은 공통의 Linux kernel  을 공유한다.

 

리눅스 커널이 필요한 이유

Docker는 진짜 의미의 "OS 가상화"가 아니라:

Linux kernel의 기능을 사용하는 프로세스 격리 기술

 

Docker가 사용하는 핵심 Linux kernel 기능:

  • namespaces → 프로세스 격리
  • cgroups → CPU / memory 제한
  • union filesystem → layered filesystem
  • iptables / network namespace → 네트워크 격리

이 기능들은 Windows kernel에는 없고,  Linux kernel에만 있다. 그래서 반드시 Linux kernel이 필요하다.

 

참고

Create Docker Windows Containers from Docker Desktop - Digital Varys

- 가상화란 무엇인가요? | IBM

 

후속 아티클

- VM 과 Container 차이

- 가상화와 컨테이너 차이

- podman과 docker 차이

목표

요구사항 기반으로 도메인 모델과 테이블 설계를 할 수 있다.

기능 요구사항 도출

요구사항 도출 후에는 대략적인 UI와 비즈니스 흐름까지 알고 있는 상태여야 한다.

회원 기능
- 회원 등록
- 회원 조회

상품 기능
- 상품 등록
- 상품 수정
- 상품 조회

주문 기능
- 상품 주문
- 주문 내역 조회
- 주문 취소

기타 요구사항
- 상품은 재고 관리가 필요하다.
- 상품의 종류는 도서, 음반, 영화가 있다.
- 상품을 카테고리로 구분할 수 있다.
- 상품 주문시 배송 정보를 입력할 수 있다.
<?php
$var1 = null; // case-insensitive constant
$var2 = NULL;

echo $var1; // (공백)
echo $var2; // (공백)

echo var_dump($var1); // NULL
echo var_dump($var2); // NULL

if($var1 == null) echo "it's null\n";       // 출력 O
if($var1 == NULL) echo "it's also NULL\n";  // 출력 O
if(is_null($var1)) echo "it's null\n";      // 출력 O
if(is_null($var2)) echo "it's also NULL\n"; // 출력 O

'#개발 아티클 > php' 카테고리의 다른 글

Types  (0) 2026.02.03
명령어 분리  (0) 2026.02.03
Escaping from HTML  (0) 2026.02.03
php 파일 실행 방법  (0) 2026.02.03

PHP는 동적 타입 언어이다. 기본적으로 변수의 타입은 런타임에 결정되므로 명시할 필요가 없는 것을 의미한다.

타입 선언을 통해 언어의 일부를 정적 타입으로 부여 가능하다.

타입은 수행할 수 있는 연산의 종류를 제한한다. 그러나 표현식이나 변수가 해당 타입이 지원하지 않는 연산에 사용되면 php는 해당 작업을 지원하는 타입으로 값을 저글링(type juggling)하려고 시도 한다. 이 프로세스는 값이 사용되는 context 에 따라 달라진다. type cast를 사용하여 표현식을 특정 유형으로 평가받도록 강제할 수 있다. 변수에 대해 settype() 함수를 사용하여 변수를 내부에서 type cast 할 수 있다.

표현식의 타입이나 값을 체크하기 위해, var_dump() 함수를 사용해라. 표현식의 타입을 반환받기 위해서는 get_dubug_type() 함수를 사용해라 그러나 표현식이 특정 타입인지 확인하기 위해서는 is_type() 함수를 사용해라

 

<!-- php 7.2.34 -->
<?php
$a_bool = true;   // a bool
$a_str = "foo";   // a string
$a_str2 = 'foo';  // a string
$an_int = 12;     // an int

echo gettype($a_bool), "\n"; // boolean
echo gettype($a_str), "\n";  // string
echo gettype($an_int), "\n"; // integer
if(is_int($an_int)) {
  $an_int += 4;
}

var_dump($an_int);  // int(16)

if(is_string($a_bool)){
  echo "String: $a_bool";
}

'#개발 아티클 > php' 카테고리의 다른 글

NULL 타입  (0) 2026.02.04
명령어 분리  (0) 2026.02.03
Escaping from HTML  (0) 2026.02.03
php 파일 실행 방법  (0) 2026.02.03

C나 perl 에서와 마찬가지로 php는 명령문이 각 명령어 끝에 세미클론으로 끝나도록 요구한다. php 코드 블록의 닫기 태그는 자동으로 세미클론을 의미한다. php 블록의 끝라인에 세미클론을 붙일 필요가 없다. 블록의 닫는 태그는 끝라인에 개행문자를 포함한다.

 

파일 끝에 php 블록의 닫기 태그는 생략 가능하다. 그래서 원치 않는 공백이 파일 맨 끝에 삽입되는 것을 피할 수 있다.

'#개발 아티클 > php' 카테고리의 다른 글

NULL 타입  (0) 2026.02.04
Types  (0) 2026.02.03
Escaping from HTML  (0) 2026.02.03
php 파일 실행 방법  (0) 2026.02.03

여는 태그와 닫는 태그 쌍을 제외한 모든 내용은 PHP Parser에 의해 무시된다.
이를 통해 HTML 문서에 php를 삽입하여 템플릿을 생성할 수 있다.

Example #1 Embedding PHP in HTML

<p>This is going to be ignored by PHP and displayed by the browser.</p>
<?php echo 'While this is going to be parsed.'; ?>
<p>This will also be ignored by PHP and displayed by the browser.</p>

Example #2 Advanced escaping using conditions

<?php if ($expression == true): ?>
  This will show if the expression is true.
<?php else: ?>
  Otherwise this will show.
<?php endif; ?>

php는 조건이 충족되지 않는 블록이 php 열기/닫기 태그 밖에 위치하더라도 건너 뛴다.

'#개발 아티클 > php' 카테고리의 다른 글

NULL 타입  (0) 2026.02.04
Types  (0) 2026.02.03
명령어 분리  (0) 2026.02.03
php 파일 실행 방법  (0) 2026.02.03

js는 브라우저에서 실행하거나 node.js를 통해 실행하면 된다.

java 는 eclipse나 intellij에서 run 버튼을 클릭하여 컴파일 후 실행하면 된다.

그렇다면 php는 단일 파일을 어떻게 실행시킬 수 있을까?

 

 

브라우저 이용

php는 일반 HTML 웹 페이지에 포함될 수 있다. 즉, HTML 문서 내에 PHP 문을 작성할 수 있다.

1. xampp 설치
2. xampp 를 통한 Apache 실행
3. php 파일을 C:\xampp\htdocs 에 위치
4. 브라우저에 'localhost/파일명' 으로 실행

php 이용

php 파일명.php

'#개발 아티클 > php' 카테고리의 다른 글

NULL 타입  (0) 2026.02.04
Types  (0) 2026.02.03
명령어 분리  (0) 2026.02.03
Escaping from HTML  (0) 2026.02.03

 JPA에서 복합키를 사용하려면 별도의 ID 클래스가 필요

package com.poc_lotte_chatbot.entity;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.IdClass;
import jakarta.persistence.Table;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@IdClass(ResocTopicRelId.class)
@Entity
@Table(name = "resoc_topic_rel", schema = "chatbi")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class ResocTopicRel {

    @Column(name = "org_party_id", nullable = false, length = 10)
    private String orgPartyId;

    @Id
    @Column(name = "resoc_id", nullable = false, precision = 10)
    private BigDecimal resocId;

    @Column(name = "resoc_gubun_code", nullable = false, length = 5)
    private String resocGubunCode;

    @Column(name = "resoc_name", nullable = false, length = 100)
    private String resocName;

    @Column(name = "prompt_topic_type", length = 100)
    private String promptTopicType;

    @Id
    @Column(name = "hist_str_date", nullable = false)
    private LocalDateTime histStrDate;

    @Id
    @Column(name = "hist_end_date", nullable = false)
    private LocalDateTime histEndDate;
}

역할:
  - 실제 데이터베이스 테이블을 매핑하는 엔티티 클래스
  - 테이블의 모든 컬럼(PK + 일반 컬럼)을 포함

  특징:
  - @IdClass(ResocTopicRelId.class): 복합키 클래스를 지정
  - @Id 어노테이션이 3개: 복합키를 구성하는 각 필드에 표시
  - 일반 컬럼들도 포함: orgPartyId, resocGubunCode, resocName, promptTopicType

  쓰임:
  - CRUD 작업의 대상
  - 비즈니스 로직에서 데이터를 담는 객체
  - Repository를 통한 데이터 조회/저장

 

package com.poc_lotte_chatbot.entity;

import jakarta.persistence.Embeddable;
import lombok.*;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;

@Embeddable
@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
public class ResocTopicRelId implements Serializable {
    private BigDecimal resocId;
    private LocalDateTime histStrDate;
    private LocalDateTime histEndDate;
}

  역할:
  - 테이블의 복합 기본키(Composite Primary Key)를 표현하는 클래스
  - resoc_topic_rel 테이블의 PK는 3개 컬럼으로 구성: (resoc_id, hist_str_date, hist_end_date)
  - JPA에서 복합키를 사용하려면 별도의 ID 클래스가 필요

  특징:
  - @Embeddable: 다른 엔티티에 포함될 수 있는 클래스임을 표시
  - Serializable 구현: JPA 복합키 요구사항
  - equals()와 hashCode() 구현 필요: @EqualsAndHashCode로 자동 생성

  쓰임:
  - 엔티티의 고유 식별자 역할
  - 엔티티 조회, 비교, 해싱 작업에 사용
  - Repository에서 findById(ResocTopicRelId id) 형태로 사용

'#개발 아티클 > JPA' 카테고리의 다른 글

JPA 메서드 네이밍 규칙  (0) 2025.10.31
Spring Data JPA Query Method  (0) 2025.10.23

원인
npm install 실행 시, git:// 프로토콜을 이용하여 Github 저장소에 접근하지 못할 때 발생하는 오류

 

조치 방법

git config --global url."https://".insteadOf git://

 

 

'#개발 아티클 > node.js' 카테고리의 다른 글

node 애플리케이션  (0) 2025.10.19

+ Recent posts