🔗 자바 의존성과 배포 완벽 가이드¶
코딩 1~2주차 초보자를 위한 친절한 설명서
📚 목차¶
- 의존성(Dependency)이란?
- 모듈, 패키지, 라이브러리, 프레임워크
- Maven과 의존성 관리
- 배포(Deployment) 이해하기
- Docker와 클라우드 배포
- 실전 예제: 챗봇 만들기
🔗 의존성(Dependency)이란?¶
🏠 집 짓기로 이해하는 의존성¶
집을 지을 때 모든 걸 처음부터 만들까요?
graph TB
A[집 짓기 프로젝트] --> B[직접 만들기]
A --> C[기존 재료 활용하기]
B --> D[벽돌 직접 만들기 📅 6개월]
B --> E[창문 직접 만들기 📅 3개월]
B --> F[문 직접 만들기 📅 2개월]
B --> G[총 11개월 소요 😱]
C --> H[벽돌 구매 📅 1일]
C --> I[창문 구매 📅 1일]
C --> J[문 구매 📅 1일]
C --> K[총 1주일 소요 😊]
의존성이란?
- 이미 만들어진 것을 가져다 쓰는 것
- 내가 직접 만들지 않고 다른 사람이 만든 코드를 사용
- import
문으로 외부 코드를 가져오는 행위
💡 실생활 예제: HTTP 요청하기¶
// ❌ 직접 구현 (2~3달 걸림)
public class MyHttpClient {
// TCP 소켓 연결
// HTTP 프로토콜 구현
// SSL/TLS 보안 처리
// 헤더 파싱
// ... 수천 줄의 코드
}
// ✅ 의존성 활용 (5분)
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
HttpClient client = HttpClient.newHttpClient();
// 끝! 바로 사용 가능
📦 모듈, 패키지, 라이브러리, 프레임워크¶
🧩 레고 블록으로 이해하기¶
graph TD
A[레고 조각 = 모듈] --> B[레고 세트 = 패키지]
B --> C[테마별 컬렉션 = 라이브러리]
C --> D[레고 놀이 규칙 = 프레임워크]
A --> A1[클래스, 메서드]
B --> B1[관련 기능들의 묶음]
C --> C1[특정 목적의 도구 모음]
D --> D1[개발 방식을 강제하는 틀]
🔍 각각의 차이점¶
1️⃣ 모듈 (Module)¶
// 하나의 기능을 담은 코드 뭉치
public class Calculator {
public int add(int a, int b) {
return a + b;
}
}
2️⃣ 패키지 (Package)¶
// 관련된 모듈들의 묶음 (폴더 구조)
com.mycompany.utils
├── Calculator.java
├── StringUtil.java
└── DateUtil.java
3️⃣ 라이브러리 (Library)¶
graph LR
A[Jackson 라이브러리] --> B[JSON 변환]
C[Apache Commons] --> D[유틸리티 모음]
E[JUnit] --> F[테스트 도구]
특징:
- 내장 라이브러리: 자바에 기본 포함 (예: String
, ArrayList
)
- 외장 라이브러리: 직접 다운로드해야 함 (예: Jackson, Spring)
- 동시 사용 가능: 여러 JSON 라이브러리를 함께 사용 가능
4️⃣ 프레임워크 (Framework)¶
graph TD
A[Spring Framework] --> B[웹 개발 규칙 강제]
C[React] --> D[UI 개발 방식 강제]
E[Django] --> F[Python 웹 개발 강제]
G[특징] --> H[하나만 선택해야 함]
G --> I[개발 방식을 정해줌]
G --> J[생태계가 큼]
라이브러리 vs 프레임워크 - 라이브러리: "내가 도구를 선택해서 사용" 🛠️ - 프레임워크: "정해진 방식대로 개발해야 함" 📋
📋 Maven과 의존성 관리¶
🛒 쇼핑몰로 이해하는 Maven¶
graph TB
A[개발자] --> B[Maven Central Repository]
B --> C[Jackson 라이브러리]
B --> D[Spring 프레임워크]
B --> E[JUnit 테스트 도구]
F[pom.xml] --> G[의존성 목록 작성]
G --> H[Maven이 자동 다운로드]
H --> I[프로젝트에서 바로 사용]
📝 pom.xml 파일 예제¶
<?xml version="1.0" encoding="UTF-8"?>
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>my-chatbot</artifactId>
<version>1.0.0</version>
<dependencies>
<!-- JSON 처리 라이브러리 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version>
</dependency>
<!-- 환경변수 처리 -->
<dependency>
<groupId>io.github.cdimascio</groupId>
<artifactId>dotenv-java</artifactId>
<version>3.0.0</version>
</dependency>
<!-- Google AI 라이브러리 -->
<dependency>
<groupId>com.google.ai</groupId>
<artifactId>generativeai</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
</project>
🔄 Maven 동작 과정¶
sequenceDiagram
participant D as 개발자
participant M as Maven
participant R as Maven Central
participant P as 프로젝트
D->>M: mvn compile 실행
M->>R: 의존성 다운로드 요청
R-->>M: JAR 파일들 전송
M->>P: lib 폴더에 라이브러리 설치
M-->>D: 빌드 완료!
🚀 배포(Deployment) 이해하기¶
🍕 피자 배달로 이해하는 배포¶
graph LR
A[피자 만들기 = 코딩] --> B[포장하기 = 빌드]
B --> C[배달하기 = 배포]
C --> D[고객이 먹기 = 사용자 접속]
A --> A1[레시피 작성]
B --> B1[JAR/WAR 파일 생성]
C --> C1[서버에 업로드]
D --> D1[웹사이트 접속 가능]
🎯 배포가 어려운 이유¶
mindmap
root((배포의 어려움))
너무 많은 방법들
FTP
Git
Docker
Kubernetes
PaaS (Vercel, Render)
복잡한 설정
네트워크 설정
보안 권한
데이터베이스 연결
환경변수 관리
CS 전공도 어려워함
학교에서 안 가르침
실무 경험 필요
계속 변화하는 기술
📊 전통적인 배포 vs 현대적 배포¶
graph TB
subgraph "전통적 배포 (어려움 😰)"
A1[Java 코드] --> A2[WAR/JAR 빌드]
A2 --> A3[서버 직접 설정]
A3 --> A4[Tomcat 설치]
A4 --> A5[데이터베이스 설정]
A5 --> A6[네트워크 설정]
A6 --> A7[보안 설정]
A7 --> A8[배포 완료]
end
subgraph "현대적 배포 (쉬움 😊)"
B1[Java 코드] --> B2[Dockerfile 작성]
B2 --> B3[GitHub에 업로드]
B3 --> B4[Render/Vercel에서 자동 배포]
B4 --> B5[배포 완료!]
end
🐳 Docker와 클라우드 배포¶
📦 Docker란? - 이사 상자 비유¶
graph TB
A[이사하기] --> B[물건 하나씩 옮기기 😰]
A --> C[이사 상자 사용하기 😊]
B --> B1[옷걸이, 책, 그릇...]
B --> B2[하나씩 포장]
B --> B3[하나씩 운반]
B --> B4[새 집에서 하나씩 정리]
C --> C1[모든 물건을 상자에 담기]
C --> C2[상자째로 운반]
C --> C3[새 집에서 상자 열기]
Docker = 애플리케이션 이사 상자 - 코드, 라이브러리, 설정 등을 하나로 묶음 - 어떤 컴퓨터에서든 동일하게 실행 - "내 컴퓨터에서는 잘 되는데?" 문제 해결
🌐 클라우드 서비스 소개¶
graph TD
A[클라우드 서비스] --> B[PaaS - 플랫폼형]
A --> C[IaaS - 인프라형]
A --> D[SaaS - 소프트웨어형]
B --> B1[Render, Vercel, Heroku]
B --> B2[코드만 올리면 끝]
B --> B3[초보자 추천 👍]
C --> C1[AWS EC2, GCP, Azure]
C --> C2[서버 직접 관리]
C --> C3[고급 사용자용]
D --> D1[Gmail, Notion, Slack]
D --> D2[완성된 서비스]
D --> D3[개발자용 아님]
🚀 간단한 배포 과정 (Render 사용)¶
sequenceDiagram
participant D as 개발자
participant G as GitHub
participant R as Render
participant U as 사용자
D->>D: Java 프로젝트 완성
D->>D: Dockerfile 작성
D->>G: 코드 업로드
G->>R: 자동 연동
R->>R: 자동 빌드 & 배포
R-->>D: 배포 완료 알림
U->>R: 웹사이트 접속
R-->>U: 애플리케이션 응답
📋 Dockerfile 예제¶
# Java 환경 준비
FROM openjdk:17-jdk-slim
# 작업 디렉토리 설정
WORKDIR /app
# JAR 파일 복사
COPY target/my-app.jar app.jar
# 포트 설정
EXPOSE 8080
# 애플리케이션 실행
CMD ["java", "-jar", "app.jar"]
🤖 실전 예제: 챗봇 만들기¶
📋 의존성 설정¶
pom.xml에서 필요한 라이브러리들
<dependencies>
<!-- Google AI 라이브러리 -->
<dependency>
<groupId>com.google.ai</groupId>
<artifactId>generativeai</artifactId>
<version>1.0.0</version>
</dependency>
<!-- 환경변수 관리 -->
<dependency>
<groupId>io.github.cdimascio</groupId>
<artifactId>dotenv-java</artifactId>
<version>3.0.0</version>
</dependency>
<!-- JSON 처리 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version>
</dependency>
</dependencies>
🔐 환경변수 관리 (.env 파일)¶
# .env 파일 (비밀 정보 저장)
GEMINI_API_KEY=your_api_key_here
SYSTEM_INSTRUCTION=200자 이내로, 중학생도 이해할 수 있게, 꾸미는 문법 없이 평문으로.
💻 챗봇 코드 구조¶
graph TD
A[Application.java] --> B[환경변수 로드]
B --> C[GeminiClient 초기화]
C --> D[사용자 입력 대기]
D --> E[AI API 호출]
E --> F[응답 출력]
F --> D
G[.env 파일] --> B
H[pom.xml] --> I[의존성 다운로드]
I --> C
🎯 핵심 코드 분석¶
public class Application {
public static void main(String[] args) {
// 1. 환경변수 로드 (비밀 정보 보호)
Dotenv dotenv = Dotenv.load();
String systemInstruction = dotenv.get("SYSTEM_INSTRUCTION");
// 2. AI 클라이언트 초기화
GeminiClient client = new GeminiClient(
GeminiModel.gemini_2_0_flash,
systemInstruction
);
// 3. 사용자와 대화
Scanner sc = new Scanner(System.in);
while (true) {
System.out.print("질문 : ");
String input = sc.nextLine();
if (input.equals("종료")) return;
String response = client.chat(input);
System.out.println(response);
}
}
}
🌟 앞으로 배울 기술들¶
🗺️ 학습 로드맵¶
graph TD
A[현재: 자바 기초] --> B[다음: Spring Boot]
B --> C[Docker 컨테이너화]
C --> D[AWS 클라우드]
D --> E[Kubernetes 오케스트레이션]
B --> B1[웹 애플리케이션 제작]
C --> C1[배포 자동화]
D --> D1[확장 가능한 인프라]
E --> E1[대규모 서비스 운영]
☁️ AWS 핵심 서비스 소개¶
mindmap
root((AWS 서비스))
컴퓨팅
EC2 (가상 서버)
Lambda (서버리스)
스토리지
S3 (파일 저장소)
RDS (데이터베이스)
네트워킹
CloudFront (CDN)
Route 53 (DNS)
보안
IAM (권한 관리)
Certificate Manager
🔧 도구별 사용 시기¶
도구 | 언제 사용? | 난이도 |
---|---|---|
Render/Vercel | 개인 프로젝트, 학습용 | ⭐ |
Docker | 팀 프로젝트, 일관된 환경 | ⭐⭐ |
AWS EC2 | 본격적인 서비스 운영 | ⭐⭐⭐ |
Kubernetes | 대규모 마이크로서비스 | ⭐⭐⭐⭐⭐ |
🎯 실습 과제 및 다음 단계¶
✅ 이번 주 목표¶
- [x] 의존성 개념 이해하기
- [x] Maven으로 라이브러리 추가하기
- [x] 환경변수로 비밀정보 관리하기
- [x] 간단한 챗봇 만들기
- [ ] GitHub에 코드 업로드하기
- [ ] Render로 첫 배포 경험하기
🚀 다음 주 학습 계획¶
gantt
title 다음 4주 학습 계획
dateFormat YYYY-MM-DD
section Week 1
Spring Boot 기초 :2025-01-08, 7d
section Week 2
데이터베이스 연동 :2025-01-15, 7d
section Week 3
Docker 컨테이너화 :2025-01-22, 7d
section Week 4
AWS 배포 실습 :2025-01-29, 7d
💡 실습 프로젝트 아이디어¶
- 할일 관리 API - Spring Boot + 데이터베이스
- 날씨 알림 봇 - 외부 API 연동 + 스케줄링
- 간단한 블로그 - 웹 인터페이스 + 파일 업로드
- 실시간 채팅 - WebSocket + Redis
📝 정리 및 핵심 포인트¶
🔑 핵심 개념 정리¶
개념 | 한 줄 요약 | 실생활 비유 |
---|---|---|
의존성 | 남이 만든 코드를 가져다 쓰기 | 완제품 구매하기 |
라이브러리 | 특정 목적의 도구 모음 | 요리 도구 세트 |
프레임워크 | 개발 방식을 정해주는 틀 | 요리 레시피책 |
배포 | 내 코드를 남들이 쓸 수 있게 하기 | 가게 오픈하기 |
Docker | 애플리케이션 포장 기술 | 이사 상자 |
🎯 실무에서 중요한 이유¶
graph LR
A[의존성 관리] --> B[개발 속도 향상]
C[적절한 배포] --> D[서비스 안정성]
E[클라우드 활용] --> F[확장성 확보]
B --> G[빠른 출시]
D --> H[사용자 만족]
F --> I[비즈니스 성공]
🚨 주의사항 및 팁¶
⚠️ 피해야 할 실수들¶
- 의존성 지옥: 너무 많은 라이브러리 사용
- 버전 충돌: 라이브러리 간 호환성 문제
- 비밀정보 노출: API 키를 코드에 직접 작성
- 무료 서비스 의존: 중요한 서비스를 무료 플랜으로만 운영
💡 성공하는 개발자의 습관¶
- 📚 공식 문서 읽기: Stack Overflow보다 공식 문서 우선
- 🔍 점진적 학습: 한 번에 모든 기술을 배우려 하지 않기
- 🤝 커뮤니티 활용: GitHub, Reddit, Discord에서 질문하기
- 🔄 꾸준한 실습: 이론보다는 직접 만들어보기
🎉 마무리¶
축하합니다! 이제 여러분은 의존성 관리와 배포의 기본 개념을 이해했습니다! 🎊
🌟 여러분이 이룬 성취¶
- ✅ 복잡한 HTTP 통신을 라이브러리로 간단하게 처리
- ✅ Maven으로 프로젝트 의존성 체계적 관리
- ✅ 환경변수로 보안 정보 안전하게 관리
- ✅ AI 챗봇이라는 실용적인 프로젝트 완성
- ✅ 배포의 전체적인 흐름과 미래 학습 방향 파악
🚀 다음 도전¶
이제 여러분은 단순한 코딩 초보자에서 시스템을 이해하는 개발자로 한 단계 성장했습니다!
다음 단계에서는: - 🌐 Spring Boot로 웹 애플리케이션 만들기 - 🗄️ 데이터베이스 연동하여 데이터 영속화 - 🐳 Docker로 어디서든 실행되는 애플리케이션 패키징 - ☁️ AWS로 실제 사용자들이 접근할 수 있는 서비스 운영
기억하세요: 모든 대단한 개발자도 여러분과 같은 과정을 거쳤습니다! 💪
계속 도전하고, 실패를 두려워하지 말고, 꾸준히 성장해 나가세요! 🌱➡️🌳