Maven 의존성 관리 완벽 가이드 - POM.xml 설정부터 실전 팁까지

Maven의 가장 강력한 기능 중 하나는 바로 의존성 관리입니다. 복잡한 Java 프로젝트에서 수많은 라이브러리들의 버전을 관리하고, 충돌을 해결하며, 일관성 있게 유지하는 것은 쉽지 않은 작업입니다. 이번 포스팅에서는 Maven의 의존성 관리 시스템을 깊이 있게 살펴보고, 실무에서 바로 적용할 수 있는 베스트 프랙티스를 소개하겠습니다.

Maven 의존성 관리의 핵심 개념

1. POM.xml 구조 이해하기

Maven 프로젝트의 심장부인 POM(Project Object Model) 파일은 모든 의존성 정보를 담고 있습니다:



    
    4.0.0
    
    com.example
    my-app
    1.0.0
    
    
    
        
            
        
    
    
    
    
        
    

2. 의존성 스코프(Scope) 이해하기

Maven은 다양한 의존성 스코프를 제공합니다:

<dependencies>
    <!-- compile (기본값): 모든 클래스패스에서 사용 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>5.3.20</version>
    </dependency>
    
    <!-- test: 테스트 컴파일과 실행 시에만 사용 -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13.2</version>
        <scope>test</scope>
    </dependency>
    
    <!-- provided: 컴파일 시에는 필요하지만 런타임에는 제공됨 -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>4.0.1</version>
        <scope>provided</scope>
    </dependency>
    
    <!-- runtime: 런타임에만 필요 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.33</version>
        <scope>runtime</scope>
    </dependency>
</dependencies>

의존성 관리 베스트 프랙티스

1. dependencyManagement 활용하기

다중 모듈 프로젝트에서는 부모 POM에서 버전을 중앙 관리하는 것이 좋습니다:

<!-- 부모 POM (parent-pom.xml) -->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>5.3.20</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.12.0</version>
        </dependency>
    </dependencies>
</dependencyManagement>

<!-- 자식 POM에서는 버전 명시 불필요 -->
<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <!-- 버전은 부모 POM에서 관리 -->
    </dependency>
</dependencies>

2. BOM (Bill of Materials) 사용하기

대규모 프레임워크나 라이브러리 세트의 버전을 일관성 있게 관리:

<dependencyManagement>
    <dependencies>
        <!-- Spring Boot BOM -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.7.12</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        
        <!-- Spring Cloud BOM -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>2021.0.7</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

3. 의존성 충돌 해결하기

의존성 충돌 확인

# 의존성 트리 분석
mvn dependency:tree

# 상세 충돌 정보 확인
mvn dependency:tree -Dverbose

# 특정 의존성 검색
mvn dependency:tree -Dincludes=commons-logging

충돌 해결 방법

<!-- 특정 전이 의존성 제외 -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>5.3.20</version>
    <exclusions>
        <exclusion>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>

4. 의존성 업데이트 관리

# 오래된 의존성 확인
mvn versions:display-dependency-updates

# 플러그인 업데이트 확인
mvn versions:display-plugin-updates

# 사용하지 않는 의존성 확인
mvn dependency:analyze

고급 의존성 관리 기법

1. 프로파일별 의존성 관리

<profiles>
    <profile>
        <id>development</id>
        <dependencies>
            <dependency>
                <groupId>com.h2database</groupId>
                <artifactId>h2</artifactId>
                <version>2.1.214</version>
                <scope>runtime</scope>
            </dependency>
        </dependencies>
    </profile>
    
    <profile>
        <id>production</id>
        <dependencies>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>8.0.33</version>
                <scope>runtime</scope>
            </dependency>
        </dependencies>
    </profile>
</profiles>

2. 조건부 의존성

<profiles>
    <profile>
        <id>java11</id>
        <activation>
            <jdk>11</jdk>
        </activation>
        <dependencies>
            <dependency>
                <groupId>javax.xml.bind</groupId>
                <artifactId>jaxb-api</artifactId>
                <version>2.3.1</version>
            </dependency>
        </dependencies>
    </profile>
</profiles>

3. 의존성 보안 검사

<build>
    <plugins>
        <plugin>
            <groupId>org.owasp</groupId>
            <artifactId>dependency-check-maven</artifactId>
            <version>8.2.1</version>
            <executions>
                <execution>
                    <goals>
                        <goal>check</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

실전 팁과 트러블슈팅

1. 의존성 문제 해결 체크리스트

  1. 버전 충돌 확인
  2. mvn dependency:tree -Dverbose
  3. 사용하지 않는 의존성 제거
  4. mvn dependency:analyze
  5. 강제 버전 지정
  6. <dependencyManagement> <dependencies> <dependency> <groupId>problematic-library</groupId> <artifactId>artifact</artifactId> <version>1.2.3</version> </dependency> </dependencies> </dependencyManagement>

2. 성능 최적화

  • 불필요한 전이 의존성 제외
  • 적절한 스코프 사용
  • 로컬 저장소 정기적 정리
    mvn dependency:purge-local-repository
    

3. CI/CD 환경 고려사항

<!-- 저장소 미러링 설정 (settings.xml) -->
<mirrors>
    <mirror>
        <id>central-mirror</id>
        <url>https://your-nexus-repository/repository/maven-public/</url>
        <mirrorOf>*</mirrorOf>
    </mirror>
</mirrors>

<!-- 배포 저장소 설정 -->
<distributionManagement>
    <repository>
        <id>releases</id>
        <url>https://your-nexus-repository/repository/maven-releases/</url>
    </repository>
    <snapshotRepository>
        <id>snapshots</id>
        <url>https://your-nexus-repository/repository/maven-snapshots/</url>
    </snapshotRepository>
</distributionManagement>

의존성 관리 베스트 프랙티스 체크리스트

버전 관리

  • dependencyManagement 사용하여 버전 중앙화
  • BOM 활용으로 관련 라이브러리 버전 일관성 유지
  • 정기적인 의존성 업데이트 검사

의존성 최적화

  • 불필요한 의존성 제거
  • 적절한 스코프 지정
  • 전이 의존성 관리

보안

  • 정기적인 취약점 검사
  • 오래된 라이브러리 업데이트
  • 신뢰할 수 있는 저장소만 사용

문서화

  • 주요 의존성에 대한 설명 주석 추가
  • 특별한 설정이나 제외 사항 문서화
  • 버전 선택 이유 기록

자주 발생하는 문제와 해결 방법

1. ClassNotFoundException

원인: 필요한 의존성이 누락되었거나 스코프가 잘못 설정됨

해결:

# 클래스가 어느 jar에 있는지 확인
mvn dependency:tree | grep 'missing-class'

# 해당 의존성 추가

2. NoSuchMethodError

원인: 의존성 버전 충돌

해결:

# 충돌하는 의존성 확인
mvn dependency:tree -Dverbose

# 올바른 버전 강제 지정

3. DependencyResolutionException

원인: 저장소 접근 문제 또는 존재하지 않는 의존성

해결:

# 저장소 설정 확인
mvn help:effective-settings

# 특정 의존성 강제 업데이트
mvn dependency:get -Dartifact=groupId:artifactId:version

마무리

Maven의 의존성 관리는 처음에는 복잡해 보일 수 있지만, 제대로 이해하고 활용하면 프로젝트 관리가 훨씬 수월해집니다. 특히 대규모 프로젝트에서는 체계적인 의존성 관리가 필수적입니다.

핵심은 다음과 같습니다:

  • dependencyManagement를 활용한 버전 중앙 관리
  • 적절한 스코프 사용으로 불필요한 의존성 최소화
  • 정기적인 의존성 분석과 업데이트
  • 보안 취약점 모니터링

Maven 기초 명령어 완벽 정리 - 개발자 필수 가이드

Maven을 설치하셨나요? 이제 본격적으로 Maven의 핵심 명령어들을 알아보겠습니다. Maven 명령어는 프로젝트의 전체 생명주기를 관리하는 데 사용되며, 빌드, 테스트, 배포 등 모든 단계를 효율적으로 처리할 수 있게 해줍니다. 이번 포스팅에서는 Java 개발자라면 반드시 알아야 할 Maven 기본 명령어들을 상세히 살펴보겠습니다.

Maven 명령어 구조 이해하기

Maven 명령어는 기본적으로 다음과 같은 구조를 가집니다:

mvn [options] [<goal(s)>] [<phase(s)>]
  • mvn: Maven 실행 명령어
  • options: 명령어 옵션 (-D, -X 등)
  • goals: 플러그인 목표 (compiler:compile 등)
  • phases: 빌드 라이프사이클 단계 (clean, compile, test 등)

필수 Maven 명령어

1. 프로젝트 생성 및 기본 정보 확인

# Maven 버전 확인
mvn -version
mvn -v

# 새 프로젝트 생성
mvn archetype:generate -DgroupId=com.example -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

# 효과적인 POM 확인
mvn help:effective-pom

# 프로젝트 의존성 트리 확인
mvn dependency:tree

2. 빌드 라이프사이클 명령어

Maven의 기본 빌드 라이프사이클은 다음 단계를 포함합니다:

# 프로젝트 유효성 검사
mvn validate

# 소스 코드 컴파일
mvn compile

# 테스트 코드 컴파일
mvn test-compile

# 단위 테스트 실행
mvn test

# 프로젝트 패키징 (JAR/WAR 생성)
mvn package

# 패키지 검증
mvn verify

# 로컬 저장소에 설치
mvn install

# 원격 저장소에 배포
mvn deploy

3. 클린 빌드 명령어

# 빌드 디렉토리(target) 제거
mvn clean

# 클린 후 컴파일
mvn clean compile

# 클린 후 패키징
mvn clean package

# 클린 후 설치
mvn clean install

자주 사용하는 조합 명령어

1. 개발 중 자주 사용하는 명령어

# 클린 빌드 후 테스트까지 실행
mvn clean test

# 클린 빌드 후 패키징 (가장 많이 사용)
mvn clean package

# 테스트 스킵하고 빌드
mvn clean package -DskipTests
mvn clean package -Dmaven.test.skip=true

# 오프라인 모드로 빌드
mvn clean package -o

2. 디버깅 관련 명령어

# 디버그 모드로 실행 (상세 로그 출력)
mvn clean install -X

# 에러 스택트레이스 출력
mvn clean install -e

# 조용한 모드 (최소 출력)
mvn clean install -q

의존성 관리 명령어

1. 의존성 분석

# 의존성 트리 확인
mvn dependency:tree

# 사용하지 않는 의존성 찾기
mvn dependency:analyze

# 의존성 목록 출력
mvn dependency:list

# 의존성 소스 다운로드
mvn dependency:sources

# 의존성 JavaDoc 다운로드
mvn dependency:resolve -Dclassifier=javadoc

2. 의존성 문제 해결

# 의존성 충돌 해결
mvn dependency:tree -Dverbose

# 특정 의존성 제거
mvn dependency:purge-local-repository

플러그인 관련 명령어

# 사용 가능한 플러그인 목표 확인
mvn help:describe -Dplugin=compiler

# 플러그인 업데이트 확인
mvn versions:display-plugin-updates

# 의존성 업데이트 확인
mvn versions:display-dependency-updates

사이트 및 문서화 명령어

# 프로젝트 사이트 생성
mvn site

# JavaDoc 생성
mvn javadoc:javadoc

# 프로젝트 보고서 생성
mvn site:run

고급 옵션과 팁

1. 시스템 속성 설정

# 시스템 속성 전달
mvn clean package -Dproperty=value

# 프로파일 활성화
mvn clean package -Pproduction

# 다중 프로파일 활성화
mvn clean package -Pdev,debug

2. 병렬 빌드

# 병렬 빌드 (CPU 코어 수만큼)
mvn clean install -T 1C

# 4개 스레드로 병렬 빌드
mvn clean install -T 4

3. 부분 빌드

# 특정 모듈부터 빌드 재개
mvn clean install -rf :module-name

# 특정 모듈과 의존 모듈만 빌드
mvn clean install -pl :module-name -am

실전 활용 예제

1. 개발 워크플로우

# 1. 코드 변경 후 빠른 테스트
mvn test

# 2. 전체 빌드 및 테스트
mvn clean verify

# 3. 배포 가능한 아티팩트 생성
mvn clean package

# 4. 로컬 환경에 설치
mvn clean install

2. CI/CD 파이프라인용 명령어

# Jenkins나 GitLab CI에서 자주 사용
mvn clean verify sonar:sonar

# 도커 이미지 빌드 포함
mvn clean package docker:build

문제 해결 팁

1. 빌드 실패 시

# 상세 에러 메시지 확인
mvn -e clean install

# 디버그 모드로 실행
mvn -X clean install

# 의존성 문제 확인
mvn dependency:tree

2. 성능 최적화

# 오프라인 모드 사용
mvn -o clean install

# 테스트 스킵
mvn clean install -DskipTests

# 병렬 빌드
mvn -T 1C clean install

마무리

Maven 명령어는 Java 프로젝트 개발의 핵심입니다. 이번 포스팅에서 소개한 명령어들을 잘 활용하면 개발 생산성을 크게 향상시킬 수 있습니다. 특히 mvn clean package, mvn clean install, mvn dependency:tree 같은 명령어는 일상적인 개발 작업에서 자주 사용되니 꼭 익혀두시기 바랍니다.

Maven 설치 완벽 가이드 - Windows, Mac, Linux에서 Maven 설치하기

Java 개발자라면 반드시 알아야 할 빌드 도구, Apache Maven! 오늘은 Windows, Mac, Linux 각 운영체제별로 Maven을 설치하는 방법을 상세히 알아보겠습니다. Maven은 프로젝트 빌드, 의존성 관리, 문서화를 자동화하는 강력한 도구로, Java 개발 생태계에서 필수적인 위치를 차지하고 있습니다.

Maven 설치 전 필수 요구사항

Maven을 설치하기 전에 반드시 확인해야 할 사항이 있습니다:

  1. Java Development Kit (JDK) 설치
    • Maven 3.9.9 (최신 안정화 버전)은 JDK 8 이상을 요구합니다
    • JAVA_HOME 환경 변수가 설정되어 있어야 합니다
    • java -version 명령어로 Java 설치 확인
  2. 시스템 요구사항
    • 약 10MB의 디스크 공간 (Maven 자체)
    • 로컬 Maven 저장소를 위한 추가 공간 (최소 500MB 권장)

Windows에서 Maven 설치하기

1. Maven 다운로드

2. Maven 설치 및 환경 변수 설정

# 1. 다운로드한 파일을 원하는 위치에 압축 해제 (예: C:\Program Files\Apache\)

# 2. 시스템 환경 변수 설정
- 시작 메뉴에서 "환경 변수" 검색
- "시스템 환경 변수 편집" 클릭
- "환경 변수" 버튼 클릭

# 3. 새 시스템 변수 추가
- 변수 이름: M2_HOME
- 변수 값: C:\Program Files\Apache\apache-maven-3.9.9

# 4. Path 변수 수정
- Path 변수 선택 후 "편집" 클릭
- "새로 만들기" 클릭
- %M2_HOME%\bin 추가

3. 설치 확인

# 명령 프롬프트 열기
mvn -version

# 출력 예시:
Apache Maven 3.9.9 (8e8579a9e76f7d015ee5ec7bfcdc97d260186937)
Maven home: C:\Program Files\Apache\apache-maven-3.9.9
Java version: 17.0.2, vendor: Oracle Corporation

macOS에서 Maven 설치하기

방법 1: Homebrew 사용 (추천)

# Homebrew가 설치되어 있지 않다면 먼저 설치
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# Maven 설치
brew install maven

# 설치 확인
mvn -version

방법 2: 수동 설치

# 1. Maven 다운로드
curl -O https://downloads.apache.org/maven/maven-3/3.9.9/binaries/apache-maven-3.9.9-bin.tar.gz

# 2. 압축 해제
tar xzvf apache-maven-3.9.9-bin.tar.gz

# 3. 설치 디렉토리로 이동
sudo mv apache-maven-3.9.9 /opt/

# 4. 환경 변수 설정 (zsh 사용 시)
echo 'export M2_HOME=/opt/apache-maven-3.9.9' >> ~/.zshrc
echo 'export PATH=$M2_HOME/bin:$PATH' >> ~/.zshrc

# 5. 설정 적용
source ~/.zshrc

# 6. 설치 확인
mvn -version

Linux에서 Maven 설치하기

Ubuntu/Debian 계열

# 방법 1: apt 패키지 매니저 사용
sudo apt update
sudo apt install maven

# 설치 확인
mvn -version

수동 설치 (모든 Linux 배포판)

# 1. Maven 다운로드
wget https://downloads.apache.org/maven/maven-3/3.9.9/binaries/apache-maven-3.9.9-bin.tar.gz

# 2. 압축 해제
tar xzvf apache-maven-3.9.9-bin.tar.gz

# 3. 설치 디렉토리로 이동
sudo mv apache-maven-3.9.9 /opt/

# 4. 환경 변수 설정
echo 'export M2_HOME=/opt/apache-maven-3.9.9' >> ~/.bashrc
echo 'export PATH=$M2_HOME/bin:$PATH' >> ~/.bashrc

# 5. 설정 적용
source ~/.bashrc

# 6. 설치 확인
mvn -version

설치 후 초기 설정

1. settings.xml 파일 설정

Maven 설정 파일은 두 곳에 위치할 수 있습니다:

  • 전역 설정: ${M2_HOME}/conf/settings.xml
  • 사용자 설정: ${user.home}/.m2/settings.xml

2. 프록시 설정 (필요한 경우)

<settings>
  <proxies>
    <proxy>
      <id>example-proxy</id>
      <active>true</active>
      <protocol>http</protocol>
      <host>proxy.example.com</host>
      <port>8080</port>
      <username>proxyuser</username>
      <password>proxypass</password>
      <nonProxyHosts>localhost|127.0.0.1</nonProxyHosts>
    </proxy>
  </proxies>
</settings>

3. 로컬 저장소 위치 변경 (선택사항)

<settings>
  <localRepository>/path/to/local/repo</localRepository>
</settings>

설치 확인 및 문제 해결

일반적인 문제와 해결방법

  1. 'mvn'은(는) 내부 또는 외부 명령... 오류
    • PATH 환경 변수에 Maven bin 디렉토리가 제대로 추가되었는지 확인
    • 터미널/명령 프롬프트를 재시작
  2. JAVA_HOME이 설정되지 않음
    • JAVA_HOME 환경 변수가 JDK 설치 디렉토리를 가리키는지 확인
    • echo %JAVA_HOME% (Windows) 또는 echo $JAVA_HOME (Mac/Linux)로 확인
  3. 버전 충돌 문제
    • 여러 버전의 Maven이 설치된 경우 PATH 우선순위 확인
    • which mvn (Mac/Linux) 또는 where mvn (Windows)로 실행 경로 확인

마무리

이제 Maven 설치가 완료되었습니다! Maven은 Java 프로젝트의 빌드와 의존성 관리를 획기적으로 간소화해주는 강력한 도구입니다. 설치 후에는 mvn archetype:generate 명령어로 새 프로젝트를 생성하거나, 기존 프로젝트에서 mvn clean install로 빌드를 시작할 수 있습니다.

데이터베이스 개발자라면 누구나 한 번쯤은 기존 데이터베이스의 ERD(Entity Relationship Diagram)를 시각화해야 할 필요성을 느끼게 됩니다. 특히 레거시 시스템을 분석하거나 기존 데이터베이스 구조를 문서화할 때, DDL(Data Definition Language)을 ERD로 변환할 수 있는 도구들은 정말 유용합니다. 오늘은 DDL을 ERD로 변환해주는 다양한 온라인 도구들을 소개하고, 각각의 특징과 장단점을 알아보겠습니다.

1. DevTools Daily - SQL DDL to ERD Diagram

DevTools Daily는 간단하지만 강력한 DDL to ERD 변환 도구를 제공합니다.

주요 특징:

  • mysqldump를 이용한 DDL 덤프 생성 가이드 제공
  • 필드 타입 표시 옵션
  • 비관계형 필드 표시 기능
  • 필드 레벨 관계 표시
  • 무료로 사용 가능

사용 방법:

mysqldump -d -u <username> -p -h <hostname> <dbname>

위 명령어로 생성된 DDL을 웹사이트에 붙여넣기만 하면 즉시 ERD가 생성됩니다.

2. SQLFlow - SQL to ERD Converter

SQLFlow는 SQL 스크립트를 ERD로 변환하는 강력한 도구입니다.

주요 특징:

  • CREATE TABLE, ALTER TABLE 구문 분석 지원
  • 외래키 관계 자동 인식
  • 데이터베이스 직접 연결 기능
  • 메타데이터 자동 추출
  • 테이블과 필드 간 관계 시각화

장점:

  • 직관적인 사용자 인터페이스
  • 다양한 데이터베이스 지원
  • 실시간 ERD 생성

3. ERDPlus

ERDPlus는 무료 ERD 모델링 도구로, DDL 변환 기능도 제공합니다.

주요 특징:

  • 개념적, 관계형, 스타 스키마 설계 지원
  • SQL DDL 생성 및 역변환
  • 웹 기반 인터페이스
  • 계정 없이도 사용 가능
  • 교육 목적으로 많이 활용

장점:

  • 완전 무료
  • 다양한 ERD 표기법 지원
  • 초보자 친화적 인터페이스

4. dbdiagram.io - DBML 기반 ERD 도구

dbdiagram.io는 코드로 ERD를 작성할 수 있는 혁신적인 도구입니다.

주요 특징:

  • DBML(Database Markup Language) 지원
  • SQL 코드 자동 생성
  • 이미지 및 PDF 내보내기
  • 온라인 공유 기능
  • 협업 도구 제공

사용 예시:

Table users {
  id int [pk, increment]
  username varchar
  created_at timestamp
}

Table posts {
  id int [pk, increment]
  title varchar
  user_id int [ref: > users.id]
}

5. Lucidchart ERD Tool

Lucidchart는 엔터프라이즈급 다이어그램 도구로, DDL 임포트 기능을 제공합니다.

주요 특징:

  • 데이터베이스 스키마 직접 임포트
  • MySQL, PostgreSQL, SQL Server, Oracle 지원
  • 자동 관계 감지
  • 협업 기능 강화
  • SQL 명령어 자동 생성

장점:

  • 전문가용 다양한 기능
  • 뛰어난 협업 도구
  • 템플릿 제공

6. Miro AI ERD Generator

Miro AI는 AI를 활용한 최신 ERD 생성 도구입니다.

주요 특징:

  • AI 기반 ERD 자동 생성
  • 자연어 프롬프트 지원
  • 실시간 협업
  • 다양한 내보내기 형식
  • 무료 플랜 제공

혁신적인 포인트:

  • AI가 텍스트 설명을 바탕으로 ERD 생성
  • 빠른 프로토타이핑 가능
  • 초보자도 쉽게 사용

7. Visual Paradigm Online ERD Tool

Visual Paradigm은 종합적인 다이어그램 솔루션을 제공합니다.

주요 특징:

  • 개념적, 논리적, 물리적 데이터 모델 지원
  • DDL 역공학 기능
  • 다양한 표기법 지원 (Chen's, Crow's Foot)
  • MS Office 통합
  • 클라우드 기반 협업

8. MyMap.AI ERD Generator

MyMap.AI는 AI를 활용한 또 다른 강력한 ERD 도구입니다.

주요 특징:

  • 자연어 처리를 통한 ERD 생성
  • SQL 파일 직접 임포트
  • 데이터베이스 최적화 제안
  • 실시간 협업
  • SQL 스크립트 다운로드

독특한 기능:

  • AI가 데이터베이스 디자인 최적화 제안
  • 팀 협업 강화
  • 무료 플랜 제공 (일일 5개 크레딧)

마무리: 어떤 도구를 선택해야 할까?

각 도구마다 장단점이 있으므로, 여러분의 상황에 맞는 도구를 선택하는 것이 중요합니다:

  • 빠른 변환이 필요하다면: DevTools Daily나 SQLFlow를 추천합니다.
  • 무료로 사용하고 싶다면: ERDPlus나 DevTools Daily가 좋은 선택입니다.
  • 코드로 ERD를 관리하고 싶다면: dbdiagram.io가 최적입니다.
  • 팀 협업이 중요하다면: Lucidchart나 Miro가 적합합니다.
  • AI 기능을 활용하고 싶다면: Miro AI나 MyMap.AI를 고려해보세요.
  • 엔터프라이즈급 기능이 필요하다면: Visual Paradigm이나 Lucidchart를 선택하세요.

데이터베이스 설계는 소프트웨어 개발의 근간이 되는 중요한 작업입니다. 이러한 DDL to ERD 도구들을 적절히 활용하면 데이터베이스 구조를 더 쉽게 이해하고, 팀원들과 효과적으로 소통할 수 있습니다. 무엇보다 기존 데이터베이스의 구조를 빠르게 파악하고 문서화하는 데 큰 도움이 될 것입니다.

 

 

[시놀로지 Docker] 실행 중지된 컨테이너에서 파일 가져오기

때로는 멈춰있거나 실행되지 않는 Docker 컨테이너에서 중요한 파일을 추출해야 하는 상황이 발생합니다. 특히 컨테이너가 충돌하거나 오류로 인해 시작할 수 없는 경우, 그 안에 있는 중요한 데이터나 로그 파일에 접근하는 것이 필요합니다. 이 글에서는 시놀로지 NAS에서 실행되지 않는 Docker 컨테이너의 파일을 안전하게 가져오는 방법을 상세히 알아보겠습니다.

1. 시놀로지 NAS에 SSH 접속하기

먼저, 시놀로지 NAS에 SSH로 접속합니다:

 
bash
ssh admin@192.168.1.100

비밀번호를 입력하여 로그인합니다.

2. 모든 컨테이너 목록 확인하기

실행 중인 컨테이너뿐만 아니라 중지된 모든 컨테이너를 확인합니다:

 
bash
sudo docker ps -a

출력 예시:

 
CONTAINER ID   IMAGE             COMMAND                  CREATED          STATUS                      PORTS     NAMES
a1b2c3d4e5f6   tomcat:9.0        "catalina.sh run"        2 weeks ago      Up 5 days                   8080/tcp  tomcat_webapp
f5e6d7c8b9a0   tomcat:8.5        "catalina.sh run"        3 weeks ago      Exited (137) 2 weeks ago              tomcat_old

여기서 f5e6d7c8b9a0는 현재 실행되지 않는 Tomcat 컨테이너입니다.

3. 중지된 컨테이너에서 파일 복사하기

docker cp 명령은 실행 중이지 않은 컨테이너에서도 파일을 복사할 수 있습니다:

 
bash
sudo docker cp f5e6d7c8b9a0:/usr/local/tomcat/logs/catalina.out /volume1/docker/stopped_container_data/

복사 대상 디렉토리가 없다면 먼저 생성합니다:

 
bash
mkdir -p /volume1/docker/stopped_container_data/

4. 디렉토리 전체 복사하기

특정 디렉토리 전체를 복사하려면:

 
bash
sudo docker cp f5e6d7c8b9a0:/usr/local/tomcat/conf/ /volume1/docker/stopped_container_data/conf/

5. 일시적으로 컨테이너 시작 없이 파일 시스템 마운트하기

더 복잡한 경우, Docker의 내부 메커니즘을 활용하여 컨테이너의 파일 시스템에 접근할 수 있습니다:

 
bash
# 새 임시 컨테이너 생성하여 중지된 컨테이너의 볼륨 마운트
sudo docker run --rm -it --volumes-from f5e6d7c8b9a0 -v /volume1/docker/recovery:/recovery alpine sh

# 알파인 리눅스 컨테이너 내부에서 실행할 명령
# 필요한 파일을 /recovery 디렉토리로 복사
cp -r /usr/local/tomcat/webapps /recovery/
cp -r /usr/local/tomcat/logs /recovery/
cp -r /usr/local/tomcat/conf /recovery/

# 작업이 완료되면 exit로 임시 컨테이너 종료
exit

이 방법은 Alpine Linux 같은 가벼운 이미지를 사용하여 임시 컨테이너를 만들고, 문제가 있는 컨테이너의 볼륨을 마운트하여 파일을 안전하게 추출합니다.

6. 컨테이너 이미지로부터 파일 추출하기

만약 컨테이너가 삭제되었지만 이미지는 남아있다면, 이미지로부터 파일을 추출할 수 있습니다:

 
bash
# 이미지에서 임시 컨테이너 생성 (시작하지 않음)
sudo docker create --name temp_container tomcat:8.5

# 파일 복사
sudo docker cp temp_container:/usr/local/tomcat/conf/server.xml /volume1/docker/image_extraction/

# 임시 컨테이너 삭제
sudo docker rm temp_container

7. Docker 볼륨 데이터 직접 접근하기

Docker 볼륨을 사용했다면, 시놀로지 파일 시스템에서 직접 접근할 수 있습니다:

 
bash
# 볼륨 목록 확인
sudo docker volume ls

# 특정 컨테이너의 볼륨 정보 확인
sudo docker inspect -f '{{ json .Mounts }}' f5e6d7c8b9a0 | python -m json.tool

볼륨 경로를 확인한 후 직접 접근:

 
bash
# 볼륨 데이터에 직접 접근
ls -la /volume1/docker/volumes/tomcat_webapps/_data/

8. 실행 불가능한 손상된 컨테이너 처리하기

컨테이너가 너무 손상되어 일반적인 방법으로 접근할 수 없는 경우, Docker의 저수준 기능을 활용합니다:

 
bash
# 컨테이너의 저장소 위치 찾기
CONTAINER_DIR=$(sudo docker inspect -f '{{.GraphDriver.Data.MergedDir}}' f5e6d7c8b9a0)

# 직접 파일 시스템 접근 (root 권한 필요)
sudo ls -la $CONTAINER_DIR/usr/local/tomcat/

# 파일 복사
sudo cp -r $CONTAINER_DIR/usr/local/tomcat/webapps /volume1/docker/recovery/

이 방법은 시놀로지 Docker 구현에 따라 접근 경로가 다를 수 있으므로 주의해야 합니다.

9. 컨테이너 커밋 후 이미지에서 파일 추출하기

중지된 컨테이너를 이미지로 변환한 후 파일을 추출하는 방법도 있습니다:

 
bash
# 중지된 컨테이너를 이미지로 커밋
sudo docker commit f5e6d7c8b9a0 recovery_image

# 새 이미지로 임시 컨테이너 실행 및 파일 추출
sudo docker run --rm -it -v /volume1/docker/recovery:/recovery recovery_image sh -c "cp -r /usr/local/tomcat/logs /recovery/"

# 복구 작업이 끝나면 임시 이미지 삭제
sudo docker rmi recovery_image

10. 자동 복구 스크립트 생성하기

자주 필요한 작업이라면 자동화 스크립트를 만들어 사용할 수 있습니다:

 
bash
#!/bin/bash
# 파일명: /volume1/scripts/recover_container_files.sh

# 변수 설정
CONTAINER_ID=$1
TARGET_DIR=$2
SOURCE_PATH=$3

# 사용법 검사
if [ -z "$CONTAINER_ID" ] || [ -z "$TARGET_DIR" ] || [ -z "$SOURCE_PATH" ]; then
    echo "사용법: $0 <컨테이너ID> <대상디렉토리> <소스경로>"
    echo "예: $0 f5e6d7c8b9a0 /volume1/backup /usr/local/tomcat/logs"
    exit 1
fi

# 대상 디렉토리 생성
mkdir -p $TARGET_DIR

# 컨테이너 상태 확인
CONTAINER_STATE=$(sudo docker inspect -f '{{.State.Running}}' $CONTAINER_ID 2>/dev/null)

if [ $? -ne 0 ]; then
    echo "컨테이너 $CONTAINER_ID를 찾을 수 없습니다."
    exit 1
fi

echo "컨테이너 $CONTAINER_ID에서 $SOURCE_PATH의 파일을 $TARGET_DIR로 복사합니다..."

# 파일 복사 시도
sudo docker cp $CONTAINER_ID:$SOURCE_PATH $TARGET_DIR/

# 결과 확인
if [ $? -eq 0 ]; then
    echo "파일 복사가 완료되었습니다. 저장 위치: $TARGET_DIR"
    exit 0
else
    echo "직접 복사 실패. 대체 방법 시도..."
    
    # 임시 컨테이너 사용하여 복구 시도
    echo "임시 컨테이너를 생성하여 파일 복구 중..."
    SOURCE_DIR=$(dirname $SOURCE_PATH)
    SOURCE_NAME=$(basename $SOURCE_PATH)
    
    sudo docker run --rm -it --volumes-from $CONTAINER_ID -v $TARGET_DIR:/recovery alpine sh -c "cp -r $SOURCE_PATH /recovery/ && echo '복구 완료'"
    
    if [ $? -eq 0 ]; then
        echo "대체 방법으로 파일 복구 성공!"
    else
        echo "모든 복구 방법 실패. 수동 조치가 필요합니다."
        exit 2
    fi
fi

스크립트를 실행 가능하게 만들고 사용합니다:

 
bash
chmod +x /volume1/scripts/recover_container_files.sh
/volume1/scripts/recover_container_files.sh f5e6d7c8b9a0 /volume1/docker/recovery /usr/local/tomcat/logs

 

 

실행되지 않는 Docker 컨테이너에서 중요한 파일을 추출하는 다양한 방법을 살펴보았습니다. 시놀로지 NAS에서 이러한 기술을 활용하면 시스템 장애나 컨테이너 문제 발생 시에도 중요한 데이터를 안전하게 복구할 수 있습니다. 실제 운영 환경에서는 미리 이러한 복구 방법을 숙지하고, 가능하다면 정기적인 백업을 통해 데이터 손실 위험을 최소화하는 것이 중요합니다.

[시놀로지 Docker] SSH로 Tomcat 컨테이너 내부 파일 가져오기

도커 컨테이너에서 실행 중인 Tomcat 서버의 내부 파일을 시놀로지 NAS로 가져와야 할 때가 있습니다. 로그 파일을 분석하거나, 설정 파일을 백업하거나, 웹 애플리케이션 파일을 추출해야 하는 경우 등 다양한 상황에서 이 기술이 필요합니다. 이번에는 SSH를 통해 Tomcat 컨테이너 내부 파일을 시놀로지 호스트로 가져오는 방법을 알아보겠습니다.

1. 시놀로지 NAS에 SSH 접속하기

먼저 시놀로지 NAS에 SSH로 접속합니다:

 
bash
ssh admin@192.168.1.100

비밀번호를 입력하여 로그인합니다.

2. 컨테이너 정보 확인하기

Tomcat 컨테이너의 ID를 확인합니다:

 
bash
sudo docker ps | grep tomcat

출력 예시:

 
CONTAINER ID   IMAGE             COMMAND                  CREATED        STATUS        PORTS                    NAMES
a1b2c3d4e5f6   tomcat:9.0        "catalina.sh run"        5 days ago     Up 5 days     0.0.0.0:8080->8080/tcp   tomcat_webapp

3. docker cp 명령으로 파일 복사하기

단일 파일 가져오기

Tomcat 컨테이너의 로그 파일을 시놀로지 NAS로 복사하려면:

 
bash
sudo docker cp a1b2c3d4e5f6:/usr/local/tomcat/logs/catalina.out /volume1/docker/tomcat_logs/

이 명령은 컨테이너 내부의 catalina.out 파일을 시놀로지의 /volume1/docker/tomcat_logs/ 디렉토리로 복사합니다.

디렉토리 전체 가져오기

Tomcat의 설정 디렉토리 전체를 복사하려면:

 
bash
sudo docker cp a1b2c3d4e5f6:/usr/local/tomcat/conf/ /volume1/docker/tomcat_backup/conf/

만약 대상 디렉토리가 존재하지 않는다면, 먼저 생성해야 합니다:

 
bash
mkdir -p /volume1/docker/tomcat_backup/conf/

웹 애플리케이션 파일 가져오기

특정 웹 애플리케이션 디렉토리를 복사하려면:

 
bash
sudo docker cp a1b2c3d4e5f6:/usr/local/tomcat/webapps/myapp/ /volume1/docker/webapp_backup/

4. 와일드카드를 사용한 파일 복사

docker cp는 직접적으로 와일드카드를 지원하지 않습니다. 하지만 다음과 같은 방법으로 비슷한 효과를 낼 수 있습니다:

 
bash
# 컨테이너 내부에서 임시 디렉토리에 파일 모으기
sudo docker exec a1b2c3d4e5f6 bash -c "mkdir -p /tmp/logs_copy && cp /usr/local/tomcat/logs/*.log /tmp/logs_copy/"

# 임시 디렉토리 전체를 복사
sudo docker cp a1b2c3d4e5f6:/tmp/logs_copy/ /volume1/docker/tomcat_logs/

# 임시 디렉토리 정리
sudo docker exec a1b2c3d4e5f6 bash -c "rm -rf /tmp/logs_copy"

5. 대용량 파일 처리하기

대용량 로그 파일이나 많은 양의 데이터를 복사할 때는 압축 후 복사하는 것이 효율적입니다:

 
bash
# 컨테이너 내에서 파일 압축
sudo docker exec a1b2c3d4e5f6 bash -c "cd /usr/local/tomcat/logs && tar -czf /tmp/tomcat_logs.tar.gz *.log"

# 압축 파일 복사
sudo docker cp a1b2c3d4e5f6:/tmp/tomcat_logs.tar.gz /volume1/docker/

# 시놀로지에서 압축 해제
cd /volume1/docker/
tar -xzf tomcat_logs.tar.gz -C tomcat_logs/

# 컨테이너 내 임시 파일 삭제
sudo docker exec a1b2c3d4e5f6 bash -c "rm /tmp/tomcat_logs.tar.gz"

6. 자동화된 백업 스크립트 만들기

정기적인 백업을 위한 간단한 쉘 스크립트를 만들 수 있습니다:

 
bash
#!/bin/bash
# 파일명: /volume1/scripts/tomcat_backup.sh

# 변수 설정
CONTAINER_ID="a1b2c3d4e5f6"
BACKUP_DIR="/volume1/docker/tomcat_backup"
DATE=$(date +%Y%m%d_%H%M%S)

# 백업 디렉토리 생성
mkdir -p ${BACKUP_DIR}/${DATE}/conf
mkdir -p ${BACKUP_DIR}/${DATE}/webapps
mkdir -p ${BACKUP_DIR}/${DATE}/logs

# 설정 파일 백업
sudo docker cp ${CONTAINER_ID}:/usr/local/tomcat/conf/ ${BACKUP_DIR}/${DATE}/conf/

# 웹앱 백업
sudo docker cp ${CONTAINER_ID}:/usr/local/tomcat/webapps/ ${BACKUP_DIR}/${DATE}/webapps/

# 로그 파일 백업
sudo docker cp ${CONTAINER_ID}:/usr/local/tomcat/logs/ ${BACKUP_DIR}/${DATE}/logs/

# 백업 완료 메시지
echo "Tomcat backup completed at ${DATE}" >> ${BACKUP_DIR}/backup_history.log

이 스크립트를 실행 가능하게 만들고 실행합니다:

 
bash
chmod +x /volume1/scripts/tomcat_backup.sh
/volume1/scripts/tomcat_backup.sh

시놀로지 작업 스케줄러를 사용하여 이 스크립트를 정기적으로 실행할 수도 있습니다.

7. 파일 권한 관리하기

복사된 파일의 권한을 적절히 설정해야 할 수도 있습니다:

 
bash
# 복사된 파일의 소유자 변경
sudo chown -R admin:users /volume1/docker/tomcat_backup/

# 권한 설정
sudo chmod -R 755 /volume1/docker/tomcat_backup/

8. 원격 시스템으로 파일 전송하기

시놀로지에서 다른 시스템으로 파일을 전송하려면 SCP나 SFTP를 사용할 수 있습니다:

 
bash
# 시놀로지에서 다른 서버로 파일 전송
scp /volume1/docker/tomcat_backup/conf/server.xml user@remote-server:/path/to/destination/

9. 실시간 모니터링 설정

중요한 로그 파일을 실시간으로 모니터링하기 위한 설정:

 
bash
# 로그 파일을 실시간으로 가져와 모니터링
sudo docker exec a1b2c3d4e5f6 bash -c "tail -f /usr/local/tomcat/logs/catalina.out" | tee /volume1/docker/tomcat_logs/live_catalina.out

Ctrl+C를 눌러 모니터링을 중단할 수 있습니다.

10. 정리 및 유지 관리

오래된 백업 파일 정리:

 
bash
# 30일 이상 된 백업 파일 삭제
find /volume1/docker/tomcat_backup/ -type d -name "2023*" -mtime +30 -exec rm -rf {} \;

 

 

시놀로지 NAS에서 Docker로 운영 중인 Tomcat 컨테이너의 내부 파일을 효율적으로 추출하고 관리하는 방법을 알아보았습니다. 이러한 기술은 서버 관리, 문제 해결, 백업 및 복구 작업에 필수적입니다. 특히 정기적인 백업 스크립트를 구성하면 중요 데이터의 안전성을 높이고 긴급 상황에서 빠르게 복구할 수 있는 기반을 마련할 수 있습니다.

아파치 톰캣(Apache Tomcat) HTTPS 적용 가이드

안녕하세요, 오늘은 아파치 톰캣 서버에 HTTPS를 적용하는 방법에 대해 상세히 알아보겠습니다. 웹 서비스의 보안이 점점 더 중요해지고 있는 요즘, HTTPS 적용은 필수적인 요소가 되었습니다. 이 글에서는 SSL/TLS 인증서를 생성하고 톰캣 서버에 적용하는 전 과정을 단계별로 설명하겠습니다.

목차

  1. HTTPS/SSL이란?
  2. SSL 인증서 종류
  3. 자체 서명 인증서 생성
  4. 인증 기관(CA)에서 발급받은 인증서 적용
  5. 톰캣 서버에 SSL 적용하기
  6. HTTP를 HTTPS로 리다이렉트 설정
  7. Spring Boot 애플리케이션에 SSL 적용
  8. 문제 해결 및 디버깅
  9. 마치며

HTTPS/SSL이란?

HTTPS(Hypertext Transfer Protocol Secure)는 웹 브라우저와 웹 서버 간의 통신을 암호화하여 보안을 강화하는 프로토콜입니다. SSL(Secure Sockets Layer) 또는 이후 버전인 TLS(Transport Layer Security)를 기반으로 하며, 다음과 같은 이점을 제공합니다:

  1. 데이터 암호화: 전송되는 모든 데이터를 암호화하여 중간에서 정보를 탈취하더라도 해독할 수 없게 합니다.
  2. 데이터 무결성: 전송 중에 데이터가 변조되지 않았음을 보장합니다.
  3. 인증: 사용자가 접속한 웹사이트가 신뢰할 수 있는 사이트임을 인증합니다.

현재 대부분의 웹 브라우저는 HTTPS로 보호되지 않은 사이트에 접속할 경우 경고 메시지를 표시하므로, 웹 서비스 운영자는 HTTPS 적용이 필수적인 상황이 되었습니다.

SSL 인증서 종류

SSL 인증서는 크게 두 가지 방식으로 얻을 수 있습니다:

  1. 자체 서명 인증서(Self-Signed Certificate): 개발용 또는 내부 테스트용으로 무료로 생성하여 사용할 수 있지만, 브라우저에서 신뢰할 수 없는 인증서로 경고가 표시됩니다.
  2. 인증 기관(CA)에서 발급받은 인증서: Let's Encrypt, Comodo, DigiCert 등의 인증 기관에서 발급받은 인증서로, 브라우저에서 신뢰할 수 있는 인증서로 인식됩니다. 일부는 무료(Let's Encrypt)이고, 일부는 유료입니다.

자체 서명 인증서 생성

개발 환경이나 테스트용으로 자체 서명 인증서를 생성하는 방법을 알아보겠습니다. 이 과정에서는 Java에서 제공하는 keytool 유틸리티를 사용합니다.

keytool을 이용한 키스토어 생성

keytool -genkey -alias tomcat -keyalg RSA -keysize 2048 -keystore keystore.jks -validity 3650

위 명령어를 실행하면 다음 정보를 입력하라는 메시지가 표시됩니다:

  • 키스토어 비밀번호
  • 이름과 성(CN, Common Name): 도메인 이름(예: example.com)을 입력
  • 조직 단위명(OU)
  • 조직명(O)
  • 시/도(L)
  • 주/도(ST)
  • 국가 코드(C): 두 글자 국가 코드(예: KR)
  • 입력한 정보가 맞는지 확인(y/n)
  • 키 비밀번호(Enter를 누르면 키스토어 비밀번호와 동일하게 설정)

PKCS12 형식으로 변환 (선택사항)

최신 버전의 톰캣에서는 PKCS12 형식을 권장합니다. JKS 형식의 키스토어를 PKCS12 형식으로 변환하려면:

keytool -importkeystore -srckeystore keystore.jks -destkeystore keystore.p12 -deststoretype PKCS12

인증 기관(CA)에서 발급받은 인증서 적용

실제 운영 환경에서는 신뢰할 수 있는 인증 기관에서 발급받은 인증서를 사용하는 것이 좋습니다. 대표적인 무료 인증 기관인 Let's Encrypt를 이용한 인증서 발급 과정을 간략히 살펴보겠습니다.

Let's Encrypt 인증서 발급 및 적용 과정

  1. Certbot 설치:
  2. # Ubuntu/Debian 기준 sudo apt-get update sudo apt-get install certbot
  3. 인증서 발급:
  4. sudo certbot certonly --standalone -d example.com -d www.example.com
  5. 발급받은 인증서 파일:
    • /etc/letsencrypt/live/example.com/cert.pem: 서버 인증서
    • /etc/letsencrypt/live/example.com/privkey.pem: 개인 키
    • /etc/letsencrypt/live/example.com/chain.pem: 인증서 체인
    • /etc/letsencrypt/live/example.com/fullchain.pem: 서버 인증서 + 인증서 체인
  6. PKCS12 형식으로 변환:
  7. sudo openssl pkcs12 -export -in /etc/letsencrypt/live/example.com/fullchain.pem -inkey /etc/letsencrypt/live/example.com/privkey.pem -out /path/to/keystore.p12 -name tomcat -CAfile /etc/letsencrypt/live/example.com/chain.pem -caname root

톰캣 서버에 SSL 적용하기

이제 생성한 또는 발급받은 인증서를 톰캣 서버에 적용하는 방법을 알아보겠습니다.

1. 키스토어 파일 위치 설정

생성된 키스토어 파일(keystore.jks 또는 keystore.p12)을 안전한 위치에 복사합니다. 예를 들어 톰캣 설치 디렉토리 내에 있는 conf 폴더나 별도의 안전한 경로에 저장할 수 있습니다.

2. server.xml 설정

톰캣의 conf 디렉토리에 있는 server.xml 파일을 열고 다음과 같이 HTTPS 커넥터를 추가합니다.

JKS 형식의 키스토어를 사용하는 경우:

<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
           maxThreads="150" SSLEnabled="true">
    <SSLHostConfig>
        <Certificate certificateKeystoreFile="/path/to/keystore.jks"
                     certificateKeystorePassword="비밀번호"
                     type="RSA" />
    </SSLHostConfig>
</Connector>

PKCS12 형식의 키스토어를 사용하는 경우:

<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
           maxThreads="150" SSLEnabled="true">
    <SSLHostConfig>
        <Certificate certificateKeystoreFile="/path/to/keystore.p12"
                     certificateKeystorePassword="비밀번호"
                     certificateKeystoreType="PKCS12"
                     type="RSA" />
    </SSLHostConfig>
</Connector>

3. 추가 속성 설정 (선택사항)

더 세밀한 설정이 필요한 경우 다음과 같은 속성을 추가할 수 있습니다:

<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
           maxThreads="150" SSLEnabled="true"
           scheme="https" secure="true"
           clientAuth="false" sslProtocol="TLS"
           sslEnabledProtocols="TLSv1.2,TLSv1.3"
           ciphers="TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,TLS_DHE_RSA_WITH_AES_256_GCM_SHA384">
    <SSLHostConfig>
        <Certificate certificateKeystoreFile="/path/to/keystore.p12"
                     certificateKeystorePassword="비밀번호"
                     certificateKeystoreType="PKCS12"
                     type="RSA" />
    </SSLHostConfig>
</Connector>

4. 톰캣 재시작

설정을 적용하기 위해 톰캣 서버를 재시작합니다.

# Windows
%CATALINA_HOME%\bin\shutdown.bat
%CATALINA_HOME%\bin\startup.bat

# Linux
$CATALINA_HOME/bin/shutdown.sh
$CATALINA_HOME/bin/startup.sh

5. 확인

웹 브라우저에서 https://localhost:8443 또는 https://your-domain:8443으로 접속하여 HTTPS가 정상적으로 적용되었는지 확인합니다. 자체 서명 인증서를 사용한 경우 브라우저에서 경고 메시지가 표시될 수 있으며, 이는 정상적인 현상입니다.

HTTP를 HTTPS로 리다이렉트 설정

사용자가 HTTP로 접속하더라도 자동으로 HTTPS로 리다이렉트되도록 설정할 수 있습니다. 이를 위해 web.xml 파일에 다음 설정을 추가합니다.

1. web.xml 수정

톰캣의 conf 디렉토리에 있는 web.xml 파일을 열고 </web-app> 태그 바로 앞에 다음 내용을 추가합니다:

<security-constraint>
    <web-resource-collection>
        <web-resource-name>Entire Application</web-resource-name>
        <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <user-data-constraint>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
</security-constraint>

2. HTTP 커넥터에 리다이렉트 설정

server.xml 파일에서 HTTP 커넥터(보통 8080 포트)에 redirectPort 속성을 추가합니다:

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443" />

이제 HTTP(8080)로 접속하면 자동으로 HTTPS(8443)로 리다이렉트됩니다.

Spring Boot 애플리케이션에 SSL 적용

Spring Boot 애플리케이션에 내장된 톰캣 서버에 SSL을 적용하는 방법은 다음과 같습니다.

1. application.properties 설정

# SSL 활성화
server.ssl.enabled=true

# 키스토어 설정
server.ssl.key-store=/path/to/keystore.p12
server.ssl.key-store-password=비밀번호
server.ssl.key-store-type=PKCS12
server.ssl.key-alias=tomcat

# 포트 설정 (기본값은 8443)
server.port=8443

2. HTTP 및 HTTPS 동시 지원 (선택사항)

Spring Boot 애플리케이션에서 HTTP와 HTTPS를 동시에 지원하려면 추가적인 설정이 필요합니다. 다음은 이를 위한 구성 예시입니다:

@Configuration
public class ServerConfig {

    @Bean
    public ServletWebServerFactory servletContainer() {
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
            @Override
            protected void postProcessContext(Context context) {
                SecurityConstraint securityConstraint = new SecurityConstraint();
                securityConstraint.setUserConstraint("CONFIDENTIAL");
                SecurityCollection collection = new SecurityCollection();
                collection.addPattern("/*");
                securityConstraint.addCollection(collection);
                context.addConstraint(securityConstraint);
            }
        };
        tomcat.addAdditionalTomcatConnectors(redirectConnector());
        return tomcat;
    }

    private Connector redirectConnector() {
        Connector connector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
        connector.setScheme("http");
        connector.setPort(8080);
        connector.setSecure(false);
        connector.setRedirectPort(8443);
        return connector;
    }
}

문제 해결 및 디버깅

HTTPS 설정 과정에서 문제가 발생할 경우 다음 사항을 확인해보세요:

  1. 키스토어 경로 확인: 설정한 키스토어 파일 경로가 올바른지 확인합니다.
  2. 키스토어 접근 권한: 톰캣 서버가 키스토어 파일에 접근할 수 있는 권한이 있는지 확인합니다.
  3. 비밀번호 확인: 키스토어 비밀번호가 올바르게 설정되었는지 확인합니다.
  4. 로그 확인: 톰캣의 로그 파일(logs/catalina.out 또는 logs/catalina.yyyy-mm-dd.log)을 확인하여 오류 메시지를 분석합니다.
  5. 포트 충돌 확인: 설정한 HTTPS 포트(8443)가 다른 프로세스에 의해 이미 사용 중인지 확인합니다.
  6. # Windows netstat -ano | findstr 8443 # Linux netstat -tulpn | grep 8443
  7. Java 버전 확인: Java 버전에 따라 지원하는 암호화 알고리즘이 다를 수 있으므로, 사용 중인 Java 버전과 호환되는 설정인지 확인합니다.

마치며

SSL/TLS를 적용함으로써 웹 애플리케이션의 보안을 강화하고, 사용자에게 더 안전한 서비스를 제공할 수 있습니다.

HTTPS 적용은 개발 환경에서는 자체 서명 인증서로도 충분하지만, 실제 운영 환경에서는 신뢰할 수 있는 인증 기관에서 발급받은 인증서를 사용하는 것이 좋습니다. Let's Encrypt와 같은 무료 인증 기관을 통해 비용 부담 없이 신뢰할 수 있는 인증서를 발급받을 수 있으니 참고하시기 바랍니다.

보안은 지속적인 관리가 필요한 영역입니다. 정기적으로 인증서를 갱신하고, 보안 취약점에 대응하여 웹 애플리케이션의 보안을 유지하는 것이 중요합니다.

 

'tomcat' 카테고리의 다른 글

아파치 톰캣(Apache Tomcat) 소개 및 설치 가이드  (0) 2025.05.06

아파치 톰캣(Apache Tomcat) 소개 및 설치 가이드

안녕하세요, 오늘은 웹 애플리케이션 개발에서 중요한 역할을 하는 아파치 톰캣(Apache Tomcat)에 대해 알아보겠습니다. 이 글에서는 톰캣의 개념부터 시작해 주요 특징, 아키텍처, 그리고 Windows와 Linux 환경에서의 설치 방법까지 상세히 다루겠습니다.

목차

  1. 톰캣이란?
  2. 톰캣의 주요 특징
  3. 아파치 웹 서버와 톰캣의 차이점
  4. 톰캣의 아키텍처
  5. 톰캣 설치하기
    • Windows 환경 설치
    • Linux 환경 설치
  6. 주요 설정 파일
  7. 마치며

톰캣이란?

톰캣(Tomcat)은 아파치 소프트웨어 재단(Apache Software Foundation)에서 개발한 오픈 소스 웹 애플리케이션 서버(WAS, Web Application Server)입니다. Java 서블릿(Servlet)과 JSP(JavaServer Pages) 기술을 지원하며, 자바 기반 웹 애플리케이션을 실행할 수 있는 환경을 제공합니다.

톰캣은 단독으로 웹 서버 역할을 할 수 있으며, 대규모 서비스에서는 아파치 웹 서버(HTTP Server)와 연동하여 사용하기도 합니다. 현재는 많은 기업과 개발자들이 자바 웹 애플리케이션을 배포하는 표준 플랫폼으로 사용하고 있습니다.

톰캣의 주요 특징

  1. 자바 서블릿 컨테이너: 톰캣은 자바 서블릿 스펙을 구현한 대표적인 서블릿 컨테이너로, 자바 웹 애플리케이션의 생명주기를 관리합니다.
  2. 경량화: 다른 상용 WAS(예: WebLogic, WebSphere)에 비해 가볍고 설치가 간편합니다.
  3. 오픈 소스: 무료로 사용 가능하며, 소스 코드가 공개되어 있어 직접 기능을 확장하거나 수정할 수 있습니다.
  4. 크로스 플랫폼: Windows, Linux, macOS 등 다양한 운영체제에서 동작합니다.
  5. 안정성 및 확장성: 수많은 프로덕션 환경에서 검증된 안정성을 제공하며, 클러스터링을 통한 확장이 가능합니다.
  6. 다양한 버전: 현재 주요 버전으로는 Tomcat 8.5, 9.0, 10.1 등이 있으며, 각 버전마다 지원하는 Java 및 서블릿 스펙이 다릅니다.

아파치 웹 서버와 톰캣의 차이점

많은 사람들이 아파치 웹 서버와 톰캣을 혼동하는 경우가 있습니다. 아래는 두 서버의 주요 차이점입니다:

구분 아파치 웹 서버 (Apache HTTP Server) 톰캣 (Apache Tomcat)

유형 정적 웹 서버 웹 애플리케이션 서버(WAS)
주요 기능 정적 컨텐츠(HTML, CSS, 이미지 등) 처리 동적 컨텐츠(서블릿, JSP) 처리
구현 언어 C/C++ Java
지원 프로토콜 HTTP/HTTPS HTTP/HTTPS, AJP
설정 파일 httpd.conf server.xml, web.xml 등

실제 프로덕션 환경에서는 아파치 웹 서버와 톰캣을 함께 사용하는 경우가 많습니다. 이를 통해 정적 컨텐츠는 아파치가 처리하고, 동적 컨텐츠는 톰캣이 처리하는 구조로 시스템을 최적화할 수 있습니다.

톰캣의 아키텍처

톰캣의 내부 구조는 다음과 같은 주요 컴포넌트로 이루어져 있습니다:

  1. Catalina: 톰캣의 서블릿 컨테이너로, 서블릿의 생명주기를 관리합니다.
  2. Coyote: HTTP 요청을 처리하는 커넥터로, 클라이언트와의 통신을 담당합니다.
  3. Jasper: JSP 엔진으로, JSP 파일을 서블릿으로 변환하고 컴파일하는 역할을 합니다.
  4. Cluster: 여러 톰캣 인스턴스 간의 세션 복제 및 로드 밸런싱을 지원합니다.
  5. High Availability: 고가용성 기능을 제공하여 시스템 장애 시에도 서비스가 중단되지 않도록 합니다.

톰캣의 계층 구조는 다음과 같습니다:

  • Server: 톰캣의 전체 인스턴스를 나타내는 최상위 컴포넌트
    • Service: 하나 이상의 커넥터와 하나의 엔진을 포함
      • Connector: 클라이언트 요청을 받아 엔진에 전달
      • Engine: 요청을 처리하는 컨테이너
        • Host: 가상 호스트, 도메인별 설정 가능
          • Context: 웹 애플리케이션

톰캣 설치하기

Windows 환경 설치

  1. JDK 설치:
    • 톰캣을 실행하기 위해서는 먼저 JDK(Java Development Kit)가 설치되어 있어야 합니다.
    • Oracle JDK 또는 OpenJDK에서 다운로드하여 설치합니다.
    • 설치 후 환경 변수 JAVA_HOME을 설정합니다.
  2. 톰캣 다운로드:
    • 아파치 톰캣 공식 사이트에서 최신 버전을 다운로드합니다.
    • Windows 사용자는 일반적으로 zip 파일이나 Windows Service Installer(.exe)를 선택합니다.
  3. 톰캣 설치:
    • zip 파일을 다운로드한 경우, 원하는 위치에 압축을 풀어줍니다(예: C:\tomcat).
    • exe 인스톨러를 사용한 경우, 설치 마법사의 지시에 따라 설치를 진행합니다.
  4. 톰캣 환경 변수 설정:
    • CATALINA_HOME 환경 변수를 톰캣 설치 디렉토리로 설정합니다.
    • Path 환경 변수에 %CATALINA_HOME%\bin을 추가합니다.
  5. 톰캣 실행:
    • 명령 프롬프트에서 %CATALINA_HOME%\bin 디렉토리로 이동합니다.
    • startup.bat 파일을 실행하여 톰캣을 시작합니다.
    • 웹 브라우저에서 http://localhost:8080 에 접속하여 톰캣 실행을 확인합니다.

Linux 환경 설치

  1. JDK 설치:
  2. # Ubuntu/Debian 기준 sudo apt update sudo apt install default-jdk # CentOS/RHEL 기준 sudo yum install java-11-openjdk-devel
  3. 톰캣 다운로드 및 설치:
  4. # 다운로드 (버전은 예시, 최신 버전 확인 필요) wget https://dlcdn.apache.org/tomcat/tomcat-10/v10.1.15/bin/apache-tomcat-10.1.15.tar.gz # 압축 해제 tar -xzvf apache-tomcat-10.1.15.tar.gz # 원하는 위치로 이동 sudo mv apache-tomcat-10.1.15 /opt/tomcat
  5. 환경 변수 설정:
  6. echo "export CATALINA_HOME=/opt/tomcat" >> ~/.bashrc echo "export PATH=$PATH:$CATALINA_HOME/bin" >> ~/.bashrc source ~/.bashrc
  7. 실행 권한 설정:
  8. chmod +x /opt/tomcat/bin/*.sh
  9. 톰캣 실행:
  10. /opt/tomcat/bin/startup.sh
  11. 방화벽 설정 (필요시):
  12. # Ubuntu/Debian sudo ufw allow 8080/tcp # CentOS/RHEL sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent sudo firewall-cmd --reload
  13. 톰캣 동작 확인:
  14. curl http://localhost:8080

주요 설정 파일

톰캣의 주요 설정 파일들과 그 역할은 다음과 같습니다:

  1. server.xml: 톰캣의 핵심 설정 파일로, 커넥터, 호스트, 서비스 등의 구성을 정의합니다.
  2. web.xml: 웹 애플리케이션의 구성 파일로, 서블릿, 필터, 리스너 등을 정의합니다.
  3. context.xml: 애플리케이션 컨텍스트에 대한 설정을 담당합니다.
  4. tomcat-users.xml: 톰캣 관리자 페이지 접근 권한 등 사용자 인증 정보를 관리합니다.
  5. catalina.properties: 시스템 속성 및 클래스 로더 설정을 관리합니다.

마치며

톰캣은 자바 웹 애플리케이션 개발자라면 반드시 알아야 할 핵심 기술 중 하나입니다. 특히 경량화된 구조와 오픈 소스라는 장점 때문에 많은 개발자와 기업에서 애용하고 있습니다.

초보자부터 전문가까지 다양한 수준의 개발자가 쉽게 접근할 수 있는 것이 톰캣의 매력이며, 다양한 버전과 설정을 통해 각자의 환경에 맞게 최적화할 수 있습니다.

'tomcat' 카테고리의 다른 글

아파치 톰캣(Apache Tomcat) HTTPS 적용 가이드  (2) 2025.05.06

시놀로지 NAS에 SSL 인증서 적용하기: 안전한 데이터 액세스를 위한 완벽 가이드

시놀로지 NAS(Network Attached Storage)는 데이터 저장과 공유를 위한 훌륭한 솔루션이지만, 원격 접속 시 보안은 매우 중요한 고려사항입니다. SSL 인증서를 적용하면 데이터 전송 중 암호화를 통해 중요 정보를 보호하고 안전한 접속 환경을 구축할 수 있습니다. 이 가이드에서는 시놀로지 NAS에 SSL 인증서를 적용하는 다양한 방법을 단계별로 상세히 알아보겠습니다.

목차

  1. SSL 인증서의 필요성
  2. 시놀로지 DSM에서 지원하는 인증서 유형
  3. Let's Encrypt 무료 인증서 발급 및 적용
  4. 상용 SSL 인증서 적용 방법
  5. 자체 서명 인증서 생성 및 적용
  6. 여러 도메인을 위한 인증서 설정
  7. 인증서 갱신 자동화
  8. 인증서 적용 후 서비스별 설정
  9. 문제 해결 가이드

SSL 인증서의 필요성

시놀로지 NAS에 SSL 인증서를 적용해야 하는 이유는 다음과 같습니다:

  1. 데이터 암호화: 사용자와 NAS 사이의 데이터 전송이 암호화되어 중간자 공격으로부터 보호
  2. 사용자 인증 보호: 로그인 정보와 같은 민감한 데이터가 암호화되어 전송
  3. 신뢰성 확보: 브라우저에서 "안전하지 않은 연결" 경고 제거
  4. 원격 접속 보안: 외부에서 안전하게 NAS에 접근 가능
  5. 모바일 앱 호환성: 많은 모바일 앱이 HTTPS 연결 필요

시놀로지 DSM에서 지원하는 인증서 유형

시놀로지 DSM(DiskStation Manager)에서는 다음과 같은 세 가지 유형의 인증서를 사용할 수 있습니다:

  1. Let's Encrypt 인증서: 무료로 제공되는 인증서로, DSM에서 자동 발급 및 갱신 지원
  2. 상용 인증서: 신뢰할 수 있는 인증 기관(CA)에서 구매한 인증서
  3. 자체 서명 인증서: 시놀로지 시스템에서 직접 생성한 인증서 (외부 신뢰 없음)

각 인증서 유형의 장단점을 비교해보겠습니다:

인증서 유형 장점 단점

Let's Encrypt - 무료<br>- 자동 갱신 가능<br>- 브라우저에서 신뢰 - 도메인 이름 필요<br>- 90일마다 갱신 필요
상용 인증서 - 장기간 유효<br>- 높은 신뢰도<br>- 비즈니스 인증 옵션 - 비용 발생<br>- 수동 갱신 필요
자체 서명 인증서 - 비용 없음<br>- 인터넷 연결 불필요<br>- 즉시 생성 가능 - 브라우저 경고 발생<br>- 클라이언트에 수동 설치 필요<br>- 신뢰성 낮음

Let's Encrypt 무료 인증서 발급 및 적용

Let's Encrypt는 가장 인기 있는 무료 SSL 인증서 발급 서비스로, 시놀로지 DSM에서 간편하게 설정할 수 있습니다.

사전 준비 사항

  1. 도메인 이름: 인증서를 발급받을 도메인이 필요합니다 (예: nas.yourdomain.com)
  2. DDNS 설정: 동적 IP 환경에서는 DDNS 서비스 설정 필요
  3. 포트 포워딩: 라우터에서 80번(HTTP) 포트 포워딩 설정 (인증 과정에 필요)
  4. DSM 6.0 이상: 최신 버전의 DSM 운영체제

단계별 Let's Encrypt 인증서 발급 방법

1. 제어판 열기

DSM에 관리자 계정으로 로그인한 후, 제어판을 엽니다.

2. 보안 섹션 접근

제어판에서 보안 > 인증서로 이동합니다.

3. 인증서 추가

"추가" 버튼을 클릭하여 새 인증서 추가 마법사를 시작합니다.

4. Let's Encrypt 인증서 선택

인증서 추가 마법사에서 새 인증서 추가를 선택한 후, Let's Encrypt 인증서 신청을 선택합니다.

5. 도메인 정보 입력

다음 정보를 입력합니다:

  • 도메인 이름: NAS에 접속할 도메인 이름 (예: nas.yourdomain.com)
  • 이메일: 인증서 만료 알림을 받을 이메일 주소

6. 인증서 발급

"적용"을 클릭하면 시놀로지 DSM이 Let's Encrypt 서버와 통신하여 인증서를 발급받습니다. 이 과정에서 도메인 소유권 확인을 위해 HTTP 챌린지가 수행됩니다.

7. 인증서 설정

인증서 발급이 완료되면, 해당 인증서를 기본 인증서로 설정합니다:

  1. 인증서 목록에서 발급받은 Let's Encrypt 인증서를 선택
  2. "설정" 버튼을 클릭
  3. "기본값으로 설정"을 선택

8. HTTPS 연결 설정

제어판 > 네트워크 > DSM 설정으로 이동하여 다음을 확인합니다:

  1. "HTTPS 자동 리디렉션" 옵션 활성화
  2. "HTTPS 연결 강제 적용" 옵션 활성화

특별 팁: Let's Encrypt 인증서 문제 해결

Let's Encrypt 인증서 발급 실패 시 확인할 사항:

  1. 포트 80 접근성: 외부에서 NAS의 80번 포트에 접근 가능한지 확인
  2. 방화벽 설정: 시놀로지 방화벽과 라우터 방화벽 설정 확인
  3. DNS 설정: 도메인이 NAS의 공인 IP로 올바르게 연결되는지 확인
  4. DDNS 업데이트: DDNS 서비스가 최신 IP 주소로 업데이트되었는지 확인

상용 SSL 인증서 적용 방법

더 긴 유효 기간이나 추가 보증이 필요한 경우, 상용 SSL 인증서를 구매하여 적용할 수 있습니다.

상용 인증서 적용 단계

1. CSR(인증서 서명 요청) 생성

  1. 제어판 > 보안 > 인증서로 이동
  2. "추가" 버튼 클릭
  3. "새 인증서 추가" 선택
  4. "인증서 서명 요청 생성"을 선택
  5. 다음 정보 입력:
    • 이름: 인증서 식별 이름
    • 조직: 회사/조직 이름
    • 조직 단위: 부서명 (선택사항)
    • 위치: 도시명
    • 주/도: 주/도 이름
    • 국가: 국가 코드
    • 이메일: 담당자 이메일
    • 도메인 이름: NAS 접속 도메인 이름
    • 비트 길이: 2048 이상 권장
  6. "적용"을 클릭하여 CSR 생성

2. 인증 기관에 CSR 제출

  1. 생성된 CSR을 텍스트로 복사
  2. 선택한 인증 기관 웹사이트에서 인증서 구매 절차 진행
  3. CSR 입력 단계에서 복사한 CSR 텍스트 붙여넣기
  4. 인증 기관의 안내에 따라 도메인 소유권 확인 및 결제 진행

3. 발급받은 인증서 설치

인증 기관에서 인증서를 발급받은 후:

  1. 제어판 > 보안 > 인증서로 이동
  2. CSR을 생성했던 인증서 항목 선택
  3. "설정" 버튼 클릭
  4. "인증서 가져오기" 선택
  5. 인증 기관에서 받은 인증서 파일(.crt, .cer 등) 업로드
  6. 중간 인증서(Chain Certificate)가 있는 경우 함께 업로드
  7. "확인"을 클릭하여 인증서 설치 완료

4. 인증서 활성화

  1. 설치된 인증서 선택
  2. "설정" 버튼 클릭
  3. "기본값으로 설정" 선택

자체 서명 인증서 생성 및 적용

인터넷에 연결되지 않은 내부 네트워크에서 사용하거나 테스트 목적으로 자체 서명 인증서를 생성할 수 있습니다.

자체 서명 인증서 생성 단계

  1. 제어판 > 보안 > 인증서로 이동
  2. "추가" 버튼 클릭
  3. "새 인증서 추가" 선택
  4. "자체 서명된 인증서 생성"을 선택
  5. 다음 정보 입력:
    • 이름: 인증서 식별 이름
    • 조직: 회사/조직 이름
    • 조직 단위: 부서명 (선택사항)
    • 위치: 도시명
    • 주/도: 주/도 이름
    • 국가: 국가 코드
    • 이메일: 담당자 이메일
    • 도메인 이름: NAS 접속 도메인 이름 또는 IP 주소
    • 비트 길이: 2048 이상 권장
    • 유효 기간(일): 인증서 유효 기간 (최대 9999일)
  6. "적용"을 클릭하여 자체 서명 인증서 생성

자체 서명 인증서 신뢰 설정 (클라이언트 측)

자체 서명 인증서는 기본적으로 브라우저에서 신뢰하지 않으므로, 각 클라이언트 기기에 인증서를 수동으로 설치해야 합니다:

인증서 내보내기

  1. 생성된 자체 서명 인증서 선택
  2. "내보내기" 버튼 클릭
  3. 인증서 파일(.crt) 다운로드

Windows에 인증서 설치

  1. 다운로드한 인증서 파일을 더블클릭
  2. "인증서 설치" 선택
  3. "로컬 컴퓨터" 선택 (관리자 권한 필요)
  4. "인증서를 다음 저장소에 저장" 선택
  5. "찾아보기" 클릭
  6. "신뢰할 수 있는 루트 인증 기관" 선택
  7. "다음"을 클릭하고 "마침"으로 설치 완료

macOS에 인증서 설치

  1. 다운로드한 인증서 파일을 더블클릭
  2. Keychain Access 앱이 열림
  3. 인증서를 시스템 키체인에 추가
  4. 인증서를 찾아 더블클릭
  5. "신뢰" 섹션 확장
  6. "이 인증서 사용 시" 옵션을 "항상 신뢰"로 변경
  7. Keychain Access 앱 종료

모바일 기기에 인증서 설치

각 모바일 기기(iOS, Android)의 설정 메뉴를 통해 인증서를 설치할 수 있습니다. 자세한 과정은 기기별로 다르므로 제조사 지침을 참조하세요.

여러 도메인을 위한 인증서 설정

시놀로지 NAS를 여러 도메인 이름으로 접근해야 하는 경우, 다음과 같은 방법을 사용할 수 있습니다:

Let's Encrypt 인증서로 여러 도메인 설정

  1. 제어판 > 보안 > 인증서로 이동
  2. "추가" 버튼 클릭
  3. "새 인증서 추가" 선택
  4. "Let's Encrypt 인증서 신청" 선택
  5. 주 도메인 이름 입력 (예: nas.yourdomain.com)
  6. "대체 이름" 섹션에 추가 도메인 입력 (예: nas2.yourdomain.com)
  7. 최대 100개 도메인까지 지원 (Let's Encrypt 제한)

와일드카드 인증서 적용 (상용 인증서)

여러 서브도메인을 사용하는 경우, 와일드카드 인증서(*.yourdomain.com)를 구매하여 적용하는 것이 효율적일 수 있습니다:

  1. 인증 기관에서 와일드카드 인증서 구매
  2. CSR 생성 시 와일드카드 도메인 이름 입력 (예: *.yourdomain.com)
  3. 발급받은, 와일드카드 인증서를 시놀로지 DSM에 적용

인증서 갱신 자동화

Let's Encrypt 인증서 자동 갱신

시놀로지 DSM은 Let's Encrypt 인증서 자동 갱신 기능을 내장하고 있습니다:

  1. 제어판 > 보안 > 인증서로 이동
  2. "설정" 버튼 클릭
  3. "Let's Encrypt 설정" 탭 선택
  4. "인증서 자동 갱신" 옵션 활성화
  5. "만료 x일 전 갱신" 값 설정 (기본값: 30일)
  6. "확인"을 클릭하여 설정 저장

갱신 알림 설정

인증서 만료에 대비하여 알림을 설정하는 것이 좋습니다:

  1. 제어판 > 알림으로 이동
  2. "규칙" 탭 선택
  3. "SSL 인증서 만료" 이벤트가 활성화되어 있는지 확인
  4. "이메일" 또는 "SMS" 알림 방식 설정

인증서 적용 후 서비스별 설정

SSL 인증서를 설치한 후, 시놀로지 NAS의 각 서비스별로 HTTPS 설정을 확인해야 합니다:

File Station 및 웹 접근

기본 DSM 인터페이스에 적용된 인증서는 File Station 및 웹 기반 파일 접근에 자동으로 적용됩니다.

사진 스테이션(Photo Station)/모멘트(Moments)

  1. 제어판 > 응용 프로그램으로 이동
  2. "사진 스테이션" 또는 "모멘트" 선택
  3. "설정" 또는 "권한" 탭에서 "HTTPS 연결 강제 적용" 옵션 활성화

비디오 스테이션(Video Station)

  1. 제어판 > 응용 프로그램으로 이동
  2. "비디오 스테이션" 선택
  3. "설정" 탭에서 "HTTPS 연결 강제 적용" 옵션 활성화

오디오 스테이션(Audio Station)

  1. 제어판 > 응용 프로그램으로 이동
  2. "오디오 스테이션" 선택
  3. "설정" 탭에서 "HTTPS 연결 강제 적용" 옵션 활성화

다운로드 스테이션(Download Station)

  1. 다운로드 스테이션 앱 실행
  2. 우측 상단 설정 아이콘 클릭
  3. "일반" 탭에서 "HTTPS 연결 강제 적용" 옵션 활성화

FTP 서비스를 FTPS로 전환

  1. 제어판 > 파일 서비스로 이동
  2. "FTP" 탭 선택
  3. "FTPS 활성화" 옵션 체크
  4. SSL/TLS 암호화 모드 선택 (명시적 또는 암시적)
  5. "적용"을 클릭하여 설정 저장

문제 해결 가이드

Let's Encrypt 인증서 발급 실패

문제 1: "도메인 확인 실패" 오류

원인: 외부에서 NAS의 80번 포트에 접근할 수 없음 해결 방법:

  1. 라우터의 포트 포워딩 설정 확인 (80번 포트)
  2. 방화벽 설정 확인
  3. ISP에서 80번 포트를 차단하지 않는지 확인 (차단 시 다른 포트로 변경 필요)

문제 2: "발급 제한 초과" 오류

원인: Let's Encrypt는 주당 발급 횟수에 제한이 있음 해결 방법:

  1. 일주일 후에 다시 시도
  2. 테스트 시 Let's Encrypt 스테이징 환경 사용 (시놀로지에서는 직접 지원하지 않음)

인증서 경고 메시지

문제: 브라우저에서 여전히 "안전하지 않은 연결" 경고 표시

원인 1: 자체 서명 인증서 사용 해결 방법: 신뢰할 수 있는 인증 기관의 인증서 사용 또는 클라이언트에 인증서 수동 설치

원인 2: 인증서와 접속 도메인/IP 불일치 해결 방법: 인증서에 등록된 도메인 이름으로 접속 (IP 주소가 아닌)

원인 3: 중간 인증서 누락 해결 방법: 상용 인증서 설치 시 중간 인증서(chain certificate)도 함께 설치

인증서 만료

문제: 인증서가 만료되어 접속 불가

원인: 자동 갱신 실패 또는 수동 갱신 누락 해결 방법:

  1. Let's Encrypt 인증서: "갱신" 버튼 클릭
  2. 상용 인증서: 새 인증서 구매 및 갱신
  3. 자체 서명 인증서: 새 인증서 생성

모바일 앱 연결 문제

문제: 시놀로지 모바일 앱에서 연결 오류

원인: 자체 서명 인증서 신뢰 문제 해결 방법:

  1. 모바일 기기에 인증서 설치
  2. 앱 설정에서 "인증서 확인 건너뛰기" 활성화 (보안 저하 주의)
  3. 신뢰할 수 있는 인증 기관의 인증서로 교체

결론

시놀로지 NAS에 SSL 인증서를 적용하는 것은 데이터 보안과 안전한 원격 접속을 위한 필수적인 단계입니다. Let's Encrypt의 무료 인증서를 활용하면 비용 부담 없이 표준 수준의 보안을 구현할 수 있으며, 상용 인증서나 자체 서명 인증서도 각 환경에 맞게 선택할 수 있습니다.

이 가이드를 통해 시놀로지 NAS에 SSL 인증서를 성공적으로 적용하고, 안전한 데이터 액세스 환경을 구축하시기 바랍니다. 인증서 설정 후에는 정기적인 갱신 상태 확인과 보안 업데이트를 통해 지속적인 보안을 유지하는 것이 중요합니다.

 

[시놀로지 Docker] SSH로 Tomcat 컨테이너 내부 접근하기 - 실전 가이드

시놀로지 NAS에서 Docker로 구동 중인 Tomcat 컨테이너에 접근하는 방법을 단계별로 알아보겠습니다. SSH 접속부터 컨테이너 내부 파일 시스템 탐색까지, 실제 사례를 바탕으로 자세히 설명해 드리겠습니다.

1. 시놀로지 NAS에 SSH 접속하기

먼저 터미널(리눅스/맥) 또는 PuTTY(윈도우)를 사용하여 시놀로지 NAS에 SSH로 접속합니다:

 
bash
ssh admin@192.168.1.100

여기서 'admin'은 시놀로지 계정명, '192.168.1.100'은 시놀로지 NAS의 IP 주소입니다. 접속 후 비밀번호를 입력하면 다음과 같은 화면이 표시됩니다:

 
admin@192.168.1.100's password: 
Linux SynologyNAS 4.4.180+ #42962 SMP Mon Oct 29 12:24:40 CST 2021 x86_64

Welcome to Synology DiskStation

DSM 7.1.1-42962 Update

2. Docker 컨테이너 확인하기

접속에 성공했다면, 다음 명령어로 현재 실행 중인 Docker 컨테이너를 확인합니다:

 
bash
sudo docker ps

출력 예시:

 
CONTAINER ID   IMAGE             COMMAND                  CREATED        STATUS        PORTS                                        NAMES
a1b2c3d4e5f6   tomcat:9.0        "catalina.sh run"        2 days ago     Up 2 days     0.0.0.0:8080->8080/tcp                       tomcat_webapp

특별히 Tomcat 컨테이너만 보고 싶다면:

 
bash
sudo docker ps | grep tomcat

3. Tomcat 컨테이너 내부로 접속하기

확인된 컨테이너 ID를 사용하여 내부 셸에 접속합니다:

 
bash
sudo docker exec -it a1b2c3d4e5f6 /bin/bash

성공적으로 접속되면 다음과 같이 프롬프트가 변경됩니다:

 
root@a1b2c3d4e5f6:/usr/local/tomcat#

이제 컨테이너 내부에 있으며, 일반적인 리눅스 명령어를 사용할 수 있습니다.

4. Tomcat 설치 경로 확인 및 탐색하기

대부분의 Tomcat Docker 이미지에서는 Tomcat이 /usr/local/tomcat에 설치되어 있습니다. 다음 명령어로 현재 디렉토리 구조를 확인해 볼 수 있습니다:

 
bash
ls -la

출력 예시:

 
total 152
drwxr-xr-x 1 root root  4096 Apr 25 09:14 .
drwxr-xr-x 1 root root  4096 Apr 25 09:14 ..
-rw-r--r-- 1 root root 18982 Mar 14 09:16 LICENSE
-rw-r--r-- 1 root root  5432 Mar 14 09:16 NOTICE
-rw-r--r-- 1 root root  2333 Mar 14 09:16 RELEASE-NOTES
-rw-r--r-- 1 root root 12761 Mar 14 09:16 RUNNING.txt
drwxr-xr-x 2 root root  4096 Mar 30 10:21 bin
drwxr-xr-x 1 root root  4096 Apr 25 09:15 conf
drwxr-xr-x 2 root root  4096 Mar 30 10:21 lib
drwxrwxrwx 1 root root  4096 Apr 30 15:42 logs
drwxr-xr-x 2 root root  4096 Mar 30 10:21 temp
drwxr-xr-x 7 root root  4096 Mar 30 10:21 webapps
drwxr-xr-x 2 root root  4096 Mar 30 10:21 work

주요 디렉토리 탐색:

 
bash
# 웹 애플리케이션 확인
ls -la webapps/

# 로그 파일 확인
ls -la logs/

# 설정 파일 확인
ls -la conf/

Tomcat 버전 확인:

 
bash
cat RELEASE-NOTES

5. 실제 배포된 웹 애플리케이션 확인하기

webapps 디렉토리에 배포된 애플리케이션을 확인합니다:

 
bash
cd webapps
ls -la

출력 예시:

 
total 16
drwxr-xr-x 7 root root 4096 Mar 30 10:21 .
drwxr-xr-x 1 root root 4096 Apr 25 09:14 ..
drwxr-xr-x 3 root root 4096 Mar 30 10:21 ROOT
drwxr-xr-x 4 root root 4096 Apr 28 14:32 myapp

특정 애플리케이션의 WEB-INF 디렉토리를 확인하여 설정 파일을 볼 수 있습니다:

 
bash
cd myapp/WEB-INF
ls -la

6. 설정 파일 수정하기

server.xml과 같은 중요한 설정 파일을 확인하고 수정할 수 있습니다:

 
bash
cd /usr/local/tomcat/conf
cat server.xml

수정이 필요한 경우, vi 에디터를 사용할 수 있습니다:

 
bash
vi server.xml

Tomcat 컨테이너에 vi가 설치되어 있지 않다면 다음 명령으로 설치할 수 있습니다:

 
bash
apt-get update && apt-get install -y vim

7. 로그 파일 모니터링하기

Tomcat의 로그 파일을 실시간으로 확인할 수 있습니다:

 
bash
cd /usr/local/tomcat/logs
tail -f catalina.out

8. 컨테이너 외부에서 파일 시스템 접근하기

SSH 세션에서 컨테이너를 종료하지 않고도 호스트 시스템에서 컨테이너 볼륨을 확인할 수 있습니다:

 
bash
# 컨테이너에서 나가기
exit

# 컨테이너 볼륨 정보 확인
sudo docker inspect a1b2c3d4e5f6 | grep -A 10 Mounts

출력 예시:

 
json
"Mounts": [
    {
        "Type": "volume",
        "Name": "tomcat_webapps",
        "Source": "/volume1/docker/volumes/tomcat_webapps/_data",
        "Destination": "/usr/local/tomcat/webapps",
        "Driver": "local",
        "Mode": "rw",
        "RW": true,
        "Propagation": ""
    }
]

이제 시놀로지 파일 시스템에서 직접 접근할 수 있습니다:

 
bash
ls -la /volume1/docker/volumes/tomcat_webapps/_data

9. WAR 파일 배포하기

외부에서 컨테이너로 WAR 파일을 복사하여 배포할 수 있습니다:

 
bash
# 로컬에서 시놀로지로 WAR 파일 업로드하기 (별도 SCP 명령)
scp myapp.war admin@192.168.1.100:/tmp/

# 시놀로지에서 컨테이너로 WAR 파일 복사하기
sudo docker cp /tmp/myapp.war a1b2c3d4e5f6:/usr/local/tomcat/webapps/

 

 

이와 같이 SSH를 통해 시놀로지 NAS의 Docker 컨테이너에 접근하면, GUI에서는 제공하지 않는 고급 관리 및 문제 해결 작업을 수행할 수 있습니다. 특히 Tomcat 서버 설정 조정이나 로그 분석, 애플리케이션 배포 등의 작업을 효율적으로 처리할 수 있어 서버 관리자에게 필수적인 기술입니다.

+ Recent posts