λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ–₯️ Backend

πŸ› οΈ λ°±μ—”λ“œ 개발 ν™˜κ²½ μ„€μ • A to Z

by hyebin (Helia) 2025. 5. 28.
λ°˜μ‘ν˜•

 


λͺ©μ°¨

     

     

    κ°œλ°œμžλŠ” μ–΄λ–»κ²Œ μ„œλ²„λ₯Ό λ§Œλ“€κ³  ν…ŒμŠ€νŠΈν• κΉŒ?

     

     

    ν”„λ‘ νŠΈμ—”λ“œμ—μ„œ λ²„νŠΌμ„ λˆ„λ₯΄λ©΄ λ°±μ—”λ“œ μ„œλ²„κ°€ 응닡을 λŒλ €μ€λ‹ˆλ‹€.

    그런데 이 λ°±μ—”λ“œ μ„œλ²„λŠ” μ–΄λ””μ„œ, μ–΄λ–»κ²Œ λ™μž‘ν•˜κ³  μžˆμ„κΉŒμš”?

     

    이번 κΈ€μ—μ„œλŠ” λ°±μ—”λ“œ κ°œλ°œμ„ μ‹œμž‘ν•˜κΈ° μœ„ν•΄ κΌ­ μ•Œμ•„μ•Ό ν•  μ„œλ²„ ν™˜κ²½ ꡬ쑰, 개발 도ꡬ μ„ΈνŒ…, 둜컬 ν…ŒμŠ€νŠΈ, Git 버전 κ΄€λ¦¬κΉŒμ§€

    개발 ν™˜κ²½ ꡬ좕 μ „λ°˜μ„ ν•˜λ‚˜μ”© 정리해 λ³΄κ² μŠ΅λ‹ˆλ‹€.


    πŸ—οΈ μ„œλ²„λŠ” μ–΄λ–»κ²Œ κ΅¬μ„±λ˜μ–΄ μžˆμ„κΉŒ?

    λ°±μ—”λ“œ κ°œλ°œμ€ λ‹¨μˆœνžˆ μ½”λ“œλ₯Ό μ§œλŠ” κ²ƒλ§ŒμœΌλ‘œ λλ‚˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

    κ·Έ μ½”λ“œκ°€ μ–΄λ””μ—μ„œ, μ–΄λ–€ ꡬ쑰둜 μ‹€ν–‰λ˜λŠ”μ§€ μ΄ν•΄ν•˜λŠ” 것도 맀우 μ€‘μš”ν•˜μ£ .

     

    μ›Ή μ„œλ²„ vs WAS, 뭐가 λ‹€λ₯ΌκΉŒ?

    μ‹€μ œ 운영 ν™˜κ²½μ—μ„œλŠ” μ—¬λŸ¬ μ„œλ²„ μ»΄ν¬λ„ŒνŠΈλ“€μ΄ ν•¨κ»˜ μž‘λ™ν•˜λ©° μ„œλΉ„μŠ€λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

     

    μ›Ή μ„œλ²„ (Web Server)

    • μ—­ν• : 정적 파일(HTML, CSS, JS, 이미지) 제곡
    • λŒ€ν‘œ μ˜ˆμ‹œ: Apache HTTP Server, Nginx
    • νŠΉμ§•: λΉ λ₯΄κ³  κ°€λ²Όμ›Œμ„œ λŒ€μš©λŸ‰ νŠΈλž˜ν”½ μ²˜λ¦¬μ— 유리

    WAS (Web Application Server)

    • μ—­ν• : 동적 μ½˜ν…μΈ  처리, λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 μ‹€ν–‰
    • λŒ€ν‘œ μ˜ˆμ‹œ: Apache Tomcat, JBoss, WebLogic
    • νŠΉμ§•: Java μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹€ν–‰ ν™˜κ²½ 제곡

     μ‹€μ œ ꡬ쑰 흐름

    [μ‚¬μš©μž] → [Nginx (μ›Ήμ„œλ²„)] → [Tomcat (WAS)] → [Spring Boot μ• ν”Œλ¦¬μΌ€μ΄μ…˜] → [MySQL DB]
    ☝️ NginxλŠ” μš”μ²­μ„ μ „λ‹¬ν•˜κ³  정적 νŒŒμΌμ„ 캐싱, Tomcat은 Java 기반 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ΅¬λ™ν•©λ‹ˆλ‹€.

    βš™οΈ Tomcat은 무엇이고, Spring Boot와 무슨 관계가 μžˆμ„κΉŒ?

    μ—­ν• 

    • WAS(Web Application Server)둜, Java 기반의 동적 μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰
    • μ‚¬μš©μžμ˜ μš”μ²­μ„ λ°›μ•„ Spring μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 컨트둀러λ₯Ό 톡해 처리

    λŒ€ν‘œ μ˜ˆμ‹œ

    • Apache Tomcat (κ°€μž₯ 널리 μ‚¬μš©λ¨)
    • JBoss, Jetty, WebLogic λ“±

    νŠΉμ§•

    • Java Servlet, JSP 기반 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰
    • Spring BootλŠ” λ‚΄μž₯ Tomcat을 ν¬ν•¨ν•˜λ―€λ‘œ 별도 μ„€μΉ˜ 없이 μ‹€ν–‰ κ°€λŠ₯

     

    πŸ’‘ μ½”λ“œ μ˜ˆμ‹œ: Spring Boot μ• ν”Œλ¦¬μΌ€μ΄μ…˜ ꡬ동

    @SpringBootApplication
    public class MyApplication {
        public static void main(String[] args) {
            SpringApplication.run(MyApplication.class, args);
            // λ‚΄μž₯ Tomcat이 μžλ™μœΌλ‘œ μ‹œμž‘λ¨ (κΈ°λ³Έ 포트: 8080)
        }
    }
    Spring Boot 덕뢄에 java -jar ν•œ μ€„λ‘œ μ„œλ²„λ₯Ό ꡬ동할 수 μžˆμ–΄ 개발이 훨씬 κ°„νŽΈν•΄μ‘ŒμŠ΅λ‹ˆλ‹€.

    πŸ“‘ NginxλŠ” λ°±μ—”λ“œ κ°œλ°œμžμ™€ μ–΄λ–€ 관계가 μžˆμ„κΉŒ?

    μ—­ν• 

    • 정적 μžμ›μ„ μ²˜λ¦¬ν•˜κ±°λ‚˜, WAS둜 νŠΈλž˜ν”½μ„ ν”„λ‘μ‹œν•˜λŠ” μ›Ή μ„œλ²„(Web Server)
    • κ³ μ„±λŠ₯ λ¦¬λ²„μŠ€ ν”„λ‘μ‹œ 및 λ‘œλ“œ λ°ΈλŸ°μ„œλ‘œ ν™œμš©

    λŒ€ν‘œ μ˜ˆμ‹œ

    • Nginx (λΉ λ₯΄κ³  κ°€λ²Όμš°λ©° 비동기 기반)
    • Apache HTTP Server

    νŠΉμ§•

    • 정적 λ¦¬μ†ŒμŠ€ μ„œλΉ™ (HTML, CSS, JS λ“±)
    • HTTPS 처리, 캐싱, λ‘œλ“œ λ°ΈλŸ°μ‹± κΈ°λŠ₯ λ‚΄μž₯
    • λ°±μ—”λ“œ μ„œλ²„(Spring Boot)둜 ν”„λ‘μ‹œ ꡬ성 κ°€λŠ₯

     

    πŸ’‘ μ„€μ • μ˜ˆμ‹œ: Nginx → Spring Boot ν”„λ‘μ‹œ

    # Nginx μ„€μ • μ˜ˆμ‹œ
    server {
        listen 80;
        server_name example.com;
        
        # 정적 파일 μ„œλΉ™
        location /static/ {
            root /var/www/html;
            expires 1y;
        }
        
        # API μš”μ²­μ„ Spring Boot둜 ν”„λ‘μ‹œ
        location /api/ {
            proxy_pass http://localhost:8080;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
    운영 ν™˜κ²½μ—μ„œλŠ” 보톡 Nginxλ₯Ό μ•žλ‹¨μ— 두고, Spring BootλŠ” API μ²˜λ¦¬μ—λ§Œ μ§‘μ€‘ν•˜λ„λ‘ κ΅¬μ„±ν•©λ‹ˆλ‹€.

    🧰 개발 도ꡬ μ„ΈνŒ…ν•˜κΈ°: IntelliJ + Spring Boot

    πŸ“Œ ν•„μˆ˜ 도ꡬ

    도ꡬ μ„€λͺ…
    IntelliJ IDEA Java κ°œλ°œμ— μ΅œμ ν™”λœ IDE
    Java JDK 17+ Java μ• ν”Œλ¦¬μΌ€μ΄μ…˜ ꡬ동을 μœ„ν•œ λŸ°νƒ€μž„
    Spring Initializr ν”„λ‘œμ νŠΈ 생성 도ꡬ (start.spring.io)
    Maven/Gradle λΉŒλ“œ 및 μ˜μ‘΄μ„± 관리 도ꡬ

     

    πŸ’‘ Maven vs Gradle 간단 비ꡐ

    ν•­λͺ© Maven Gradle
    μ„ μ–Έ 방식 XML Groovy/Kotlin DSL
    속도 λ‹€μ†Œ 느림 빠름 (μΊμ‹œ, 병렬 처리)
    가독성 λͺ…ν™•ν•˜κ³  직관적 μœ μ—°ν•˜μ§€λ§Œ 볡작 κ°€λŠ₯μ„±
    μž…λ¬ΈμžλΌλ©΄ MavenλΆ€ν„° μ‹œμž‘ν•˜λŠ” 것이 훨씬 μ΄ν•΄ν•˜κΈ° μ‰½μŠ΅λ‹ˆλ‹€.

    πŸ§ͺ 둜컬 개발 μ„œλ²„ μ‹€ν–‰ν•˜κ³  ν…ŒμŠ€νŠΈν•˜κΈ°

    첫 번째 API 컨트둀러 λ§Œλ“€κΈ°

    @RestController
    @RequestMapping("/api")
    public class HelloController {
        
        @GetMapping("/hello")
        public ResponseEntity<String> hello() {
            return ResponseEntity.ok("Hello Backend!");
        }
        
        @GetMapping("/health")
        public ResponseEntity<Map<String, Object>> health() {
            Map<String, Object> status = new HashMap<>();
            status.put("status", "UP");
            status.put("timestamp", LocalDateTime.now());
            status.put("port", 8080);
            return ResponseEntity.ok(status);
        }
        
        @PostMapping("/echo")
        public ResponseEntity<Map<String, String>> echo(@RequestBody Map<String, String> request) {
            Map<String, String> response = new HashMap<>();
            response.put("message", "Echo: " + request.get("message"));
            response.put("timestamp", LocalDateTime.now().toString());
            return ResponseEntity.ok(response);
        }
    }

     

    μ„œλ²„ μ‹€ν–‰ 방법

    방법 1: IntelliJ μ‹€ν–‰

    • Application.java μ—΄κΈ° → 초둝 λ²„νŠΌ 클릭
    • μ½˜μ†”μ—μ„œ Tomcat started on port 8080 확인

    방법 2: 터미널 μ‹€ν–‰ (Maven κΈ°μ€€)

    # ν„°λ―Έλ„μ—μ„œ ν”„λ‘œμ νŠΈ 루트 λ””λ ‰ν† λ¦¬μ—μ„œ μ‹€ν–‰
    ./mvnw spring-boot:run
    
    # λ˜λŠ” νŒ¨ν‚€μ§• ν›„ μ‹€ν–‰
    ./mvnw clean package
    java -jar target/demo-0.0.1-SNAPSHOT.jar

     

    λ‹€μ–‘ν•œ API ν…ŒμŠ€νŠΈ 방법

    도ꡬ μ˜ˆμ‹œ
    λΈŒλΌμš°μ € http://localhost:8080/api/hello
    curl curl -X GET http://localhost:8080/api/hello
    Postman GET/POST μš”μ²­ μ‹œκ°μ μœΌλ‘œ ν…ŒμŠ€νŠΈ κ°€λŠ₯
    IntelliJ HTTP Client .http 파일 생성 ν›„ ν…ŒμŠ€νŠΈ
    ### GET μš”μ²­
    GET http://localhost:8080/api/hello
    Accept: application/json
    
    ### POST μš”μ²­
    POST http://localhost:8080/api/echo
    Content-Type: application/json
    
    {
      "message": "Hello from IntelliJ!"
    }

    πŸš€  개발 νš¨μœ¨μ„ λ†’μ΄λŠ” 팁: Spring Boot DevTools

    spring:
      devtools:
        restart:
          enabled: true
        livereload:
          enabled: true
    • μ½”λ“œ λ³€κ²½ μ‹œ μžλ™ μž¬μ‹œμž‘
    • λΈŒλΌμš°μ € μžλ™ μƒˆλ‘œκ³ μΉ¨
    • μΊμ‹œ μžλ™ λΉ„ν™œμ„±ν™”
    ν”„λ‘ νŠΈμ—”λ“œ κ°œλ°œμžμ—κ²Œ ν•« λ¦¬λ‘œλ“œκ°€ μžˆλ‹€λ©΄, λ°±μ—”λ“œμ—κ² DevToolsκ°€ μžˆμŠ΅λ‹ˆλ‹€!

    πŸ”„  Git으둜 버전 관리 μ‹œμž‘ν•˜κΈ°

    λ°±μ—”λ“œ ν”„λ‘œμ νŠΈλ„ λ°˜λ“œμ‹œ 버전 관리λ₯Ό ν•΄μ•Ό ν•©λ‹ˆλ‹€.

    특히 ν˜‘μ—…μ„ ν•˜κ±°λ‚˜ μ—¬λŸ¬ κΈ°λŠ₯을 λ™μ‹œμ— κ°œλ°œν•  땐 Git이 ν•„μˆ˜μ£ .

    기본적인 Git 흐름

    git init
    git add .
    git commit -m "Initial commit"
    
    git remote add origin https://github.com/yourname/project.git
    git push -u origin main

     

     λΈŒλžœμΉ˜ μ „λž΅ μ˜ˆμ‹œ

    git checkout -b feature/login
    브랜치λ₯Ό κΈ°λŠ₯ λ‹¨μœ„λ‘œ λ‚˜λˆ  μž‘μ—…ν•˜λ©΄ ν˜‘μ—… νš¨μœ¨λ„ μ˜¬λΌκ°€κ³ , μ½”λ“œ 관리도 훨씬 μ‰¬μ›Œμ§‘λ‹ˆλ‹€.

    🧑  λ§ˆλ¬΄λ¦¬ν•˜λ©°

    이번 κΈ€μ—μ„œλŠ” λ°±μ—”λ“œ κ°œλ°œμ„ μ‹œμž‘ν•˜κΈ° μœ„ν•œ ν™˜κ²½ μ„€μ • μ „λ°˜μ„ μ‚΄νŽ΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

     

    πŸ“Œ  핡심 μš”μ•½

    • λ°±μ—”λ“œ κ΅¬μ‘°λŠ” Web Server + WAS + DB둜 ꡬ성됨
    • Spring BootλŠ” λ‚΄μž₯ Tomcat 덕뢄에 싀행이 κ°„νŽΈ
    • IntelliJ + Maven/Gradle 쑰합이 일반적
    • DevTools, Git λ“± μ‹€λ¬΄μ—μ„œ μ‚¬μš©ν•˜λŠ” 개발 생산성 도ꡬ 읡히기
    • λ‹€μ–‘ν•œ λ°©μ‹μœΌλ‘œ API ν…ŒμŠ€νŠΈν•˜λ©° λ‘œμ§μ„ 점검할 수 있음
    • Git을 톡해 μ•ˆμ •μ μ΄κ³  체계적인 μ½”λ“œ 관리가 κ°€λŠ₯

    개발 ν™˜κ²½μ„ μ œλŒ€λ‘œ μ„ΈνŒ…ν•˜λ©΄ μ΄ν›„μ˜ ν•™μŠ΅κ³Ό μ‹€μŠ΅μ΄ 훨씬 μˆ˜μ›”ν•΄μ§‘λ‹ˆλ‹€.

    특히 Spring Boot DevTools와 같은 도ꡬλ₯Ό ν™œμš©ν•˜λ©΄ 개발 생산성을 크게 ν–₯μƒμ‹œν‚¬ 수 μžˆμ–΄μš”.

     

    λ‹€μŒ κΈ€μ—μ„œλŠ” Spring ν”„λ ˆμž„ μ›Œν¬μ— λŒ€ν•΄ μ•Œμ•„λ³Όκ²Œμ—μš”.

    κΆκΈˆν•œ μ μ΄λ‚˜ ν™˜κ²½ μ„€μ • κ³Όμ •μ—μ„œ λ§‰νžˆλŠ” 뢀뢄이 μžˆλ‹€λ©΄ λŒ“κΈ€λ‘œ λ‚¨κ²¨μ£Όμ„Έμš”! πŸš€

    λ°˜μ‘ν˜•