λͺ©μ°¨
κ°λ°μλ μ΄λ»κ² μλ²λ₯Ό λ§λ€κ³ ν μ€νΈν κΉ?
νλ‘ νΈμλμμ λ²νΌμ λλ₯΄λ©΄ λ°±μλ μλ²κ° μλ΅μ λλ €μ€λλ€.
κ·Έλ°λ° μ΄ λ°±μλ μλ²λ μ΄λμ, μ΄λ»κ² λμνκ³ μμκΉμ?
μ΄λ² κΈμμλ λ°±μλ κ°λ°μ μμνκΈ° μν΄ κΌ μμμΌ ν μλ² νκ²½ ꡬ쑰, κ°λ° λꡬ μΈν , λ‘컬 ν μ€νΈ, 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 νλ μ μν¬μ λν΄ μμλ³Όκ²μμ.
κΆκΈν μ μ΄λ νκ²½ μ€μ κ³Όμ μμ λ§νλ λΆλΆμ΄ μλ€λ©΄ λκΈλ‘ λ¨κ²¨μ£ΌμΈμ! π
'π₯οΈ Backend' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
π§ λ°±μλ κ°λ°μλ₯Ό μν JPA ν΅μ¬ μ 리 (0) | 2025.05.30 |
---|---|
π± Spring ν΅μ¬ κ°λ λ§μ€ν°νκΈ° (0) | 2025.05.29 |
π μΉμ κΈ°λ³Έ κ°λ κ³Ό HTTP μμ μ 볡 (0) | 2025.05.27 |
π» λ°±μλλ 무μμΈκ°? (0) | 2025.05.20 |