Project

[Project/4th] 2. ์Šคํ”„๋ง ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ, ๊ฐœ๋ฐœํ™˜๊ฒฝ ๊ตฌ์„ฑ

giraffe_ 2024. 3. 26. 15:03

[ํ”„๋กœ์ ํŠธ ์ผ์ง€] 4๋ฒˆ์งธ ํ”„๋กœ์ ํŠธ - 1. ์„œ๋ฒ„ ์„ค๊ณ„ํ•˜๊ธฐ

 

 

 

 

 

์ €์ €๋ฒˆ์ฃผ์— ์ง„ํ–‰ํ•œ ๋‚ด์šฉ์ด์ง€๋งŒ ์ด์ œ์„œ์•ผ ๊ธฐ๋กํ•˜๋Š” ์Šคํ”„๋ง ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ๊ณผ ๊ฐœ๋ฐœํ™˜๊ฒฝ ๊ตฌ์„ฑ ์ด์•ผ๊ธฐ!

 

 

 

 

๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ


OS : MAC OS(M2)

IDE : IntelliJ IDEA 2023.3.5 (Ultimate Edition) 

JDK : Amazon corretto 17.0.10

Server : Spring Boot 3.2.4

DB : MySQL 8.0.36

 

 

 

 

 

Spring Boot ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ๋ฐ ์„ค์ •


๋ฐฑ์—”๋“œ ์„œ๋ฒ„๋ฅผ ์ƒˆ๋กœ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์Šคํ”„๋ง ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ–ˆ๋‹ค.

 

24๋…„ 3์›” ๊ธฐ์ค€, ํ˜„์žฌ Spring Boot์˜ ์ตœ์‹ ๋ฒ„์ „์€ `3.3.0`์ด์ง€๋งŒ, SNAPSHOT ๋ฒ„์ „์ด ์•„๋‹Œ `3.2.4`๋กœ ์ƒ์„ฑ์„ ํ–ˆ๋‹ค.

Spring Boot 3 ๋ฒ„์ „๋ถ€ํ„ฐ Java 17์ด์ƒ์„ ์จ์•ผ ํ•œ๋‹ค. Java 17 ๋ฒ„์ „์˜ JDK๋ฅผ ์•Œ์•„๋ณด๋‹ค๊ฐ€ `Amazon corretto 17.0.10`์„ ์„ ํƒํ–ˆ๋‹ค.

 

Oracle JDK๋Š” ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋ผ์ด์„ผ์Šค ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•ด์„œ ์ œ์™ธ์‹œ์ผฐ๋‹ค.

๋‹ค๋ฅธ ๋ฌด๋ฃŒ Open JDK๋กœ๋Š” Azul zulu, Amazon corretto, Temurin์ด ์žˆ์—ˆ๋‹ค. ์ฐจ์ด์ ์„ ์•Œ์•„๋ดค์œผ๋‚˜ ๋‚ด๊ฐ€ ์•„๋Š” ์ง€์‹ ์ˆ˜์ค€์œผ๋กœ๋Š” ๋ณ„ ์ฐจ์ด๊ฐ€ ์—†์–ด๋ณด์˜€๊ณ , AWS๊ธฐ๋ฐ˜์œผ๋กœ ์„œ๋ฒ„๋ฅผ ์šด์˜ํ• ๊ฑฐ๋ผ Amazon corretto์„ ์„ ํƒํ–ˆ๋‹ค.

 

 

+ ๋‚ด ์ปดํ“จํ„ฐ์— ์ƒˆ๋กœ Amazon corretto aarch64์„ ๋‹ค์šด๋ฐ›์•˜์–ด์•ผ ํ–ˆ๋‹ค. ๋งฅ๋ถ m1, m2์˜ ์• ํ”Œ ์‹ค๋ฆฌ์ฝ˜ ์นฉ์ด aarch64 ์•„ํ‚คํ…์ฒ˜๋ผ์„œ aarch64 ๋ฒ„์ „์„ ๋‹ค์šด๋ฐ›์•„์•ผ ํ–ˆ์—ˆ๋‹ค..

 

 

 

 

 

Dependency ์ถ”๊ฐ€

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	compileOnly 'org.projectlombok:lombok'
	developmentOnly 'org.springframework.boot:spring-boot-devtools'
	runtimeOnly 'com.h2database:h2'
	runtimeOnly 'com.mysql:mysql-connector-j'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

 

  • spring-boot-devtools : ์„œ๋ฒ„ ์žฌ์‹œ์ž‘ ํ•„์š”์—†์ด ํŽธํ•˜๊ฒŒ ๊ฐœ๋ฐœํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ถ”๊ฐ€
  • spring-boot-starter-web : spring mvc, ๋‚ด์žฅ ํ†ฐ์บฃ ์‚ฌ์šฉ์œ„ํ•œ ์Šคํƒ€ํ„ฐ ์ถ”๊ฐ€
  • mysql-connector-j : Mysql DB ์—ฐ๊ฒฐ์„ ์œ„ํ•ด ์ถ”๊ฐ€
  • spring-boot-starter-data-jpa : DB์™€ ๋งคํ•‘ ์œ„ํ•ด JPA ์‚ฌ์šฉํ•  ๊ฑฐ๋ผ์„œ ์ถ”๊ฐ€
  • lombok : ์–ด๋…ธํ…Œ์ด์…˜๋งŒ์œผ๋กœ getter, ์ƒ์„ฑ์ž ๋“ฑ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€

 

 

 

 

 

application.yml ์„ค์ •

spring:
  application:
    name: #์„œ๋น„์Šค์ด๋ฆ„

  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/#์„œ๋น„์Šค์ด๋ฆ„#?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Seoul&characterEncoding=UTF-8
    username: #๊ณ„์ •๋ช…
    password: #๋น„๋ฐ€๋ฒˆํ˜ธ

  jpa:
    hibernate:
      ddl-auto: update
    properties:
      hibernate:
        show_sql: true
        format_sql: true

 

  • datacource ์—ฐ๊ฒฐ
    • ์ผ๋‹จ ๋กœ์ปฌ ํ™˜๊ฒฝ์—์„œ ๊ฐœ๋ฐœํ• ๊ฑฐ๋ผ์„œ ๋กœ์ปฌ DB๋กœ ์—ฐ๊ฒฐํ–ˆ๋‹ค.
    • ์ค‘๊ฐ„์— `allowPublicKeyRetrieval=true` ์ด๊ฑฐ ์•ˆ์ ์—ˆ๋”๋‹ˆ ์—๋Ÿฌ๊ฐ€ ๋‚ฌ์—ˆ๋‹ค. mysql 8.0 ๋ฒ„์ „๋ถ€ํ„ฐ๋Š” ๋ณด์•ˆ์ ์ธ ์ด์Šˆ๋กœ useSSL ์˜ต์…˜์— ๋Œ€ํ•œ ์ถ”๊ฐ€์ ์ธ ์„ค์ •์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ํ•œ๋‹ค.
  • jpa ์˜ต์…˜
    • ddl-auto : ๊ฐœ๋ฐœํ•˜๋ฉด์„œ ์ž๋™์œผ๋กœ ํ…Œ์ด๋ธ”๊ณผ ์นผ๋Ÿผ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด ์„ค์ •ํ–ˆ๋‹ค. ์šด์˜ ์„œ๋ฒ„์—์„œ๋Š” ๊บผ์•ผํ•œ๋‹ค. 
    • show-sql, format-sql : ์ฟผ๋ฆฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋‚ ๋ผ๊ฐ€๋Š”์ง€ ๋ณด๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€ํ–ˆ๋‹ค.
  • ์ถ”๊ฐ€๋กœ Logging ์„ค์ •ํ•ด์„œ ๋ฐ”์ธ๋”ฉ๋˜๋Š” ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ ์ถœ๋ ฅํ•˜๊ณ  ์‹ถ์—ˆ๋Š”๋ฐ, 3.X ๋ฒ„์ „์—์„œ๋Š” ๊ธฐ์กด ์ฝ”๋“œ๊ฐ€ ์•ˆ๋จน๋Š”๋‹ค...

 

 

 

DB ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ ์™„๋ฃŒ

์ดํ›„, ๋กœ์ปฌ์—์„œ ์ƒ์„ฑํ•œ DB์— ์—ฐ๊ฒฐ์ด ์ž˜ ๋˜๋Š”์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด์คฌ๋‹ค. ๊ธฐ๋ณธ์ ์ธ ์„ค์ •์ด ๋๋‚ฌ๋‹ค.

 

 

 

 

 

ํ…Œ์ŠคํŠธ Controller ๋งŒ๋“ค๊ธฐ


์„œ๋ฒ„๊ฐ€ ์ œ๋Œ€๋กœ ์‹คํ–‰์ด ๋˜๋Š”์ง€ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ํ…Œ์ŠคํŠธ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ƒ์„ฑํ•ด์„œ "hello"๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” API๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.

"localhost:8080/test/hello" ๋กœ GET ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด "hello"์™€ ํ•จ๊ป˜ 200 OK ์ƒํƒœ ์ฝ”๋“œ๊ฐ€ ๋ฐ˜ํ™˜๋œ๋‹ค.

 

@RestController
@RequestMapping("/test")
public class TestController {
    @GetMapping("/hello")
    public ResponseEntity<?> test() {
        return new ResponseEntity<String>("hello", HttpStatus.OK);
    }
}

 

 

 

ํ”„๋ก ํŠธ์—์„œ๋„ ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ ํ•ด๋ณธ๋‹ค๊ณ  ์š”์ฒญ์„ ๋ณด๋ƒˆ๋Š”๋ฐ ์‘๋‹ต์ด ์ž˜ ์˜จ๋‹ค๊ณ  ํ•ด์คฌ๋‹ค.