๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Project ESG+AI/Tech Basics

18์ผ์ฐจ. IT ๊ฐœ๋… ์ •๋ฆฌ

by GreenJin_S2 2025. 11. 3.


๐Ÿ“Š ๊ฒฐ๋ก  ์š”์•ฝ

ํ•„๋“œ๋ช…์ž๋ฃŒํ˜•์ด์œ 
site String ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ (์ด๋ฆ„, ๋ช…์นญ ๋“ฑ)
scope1Tco2e Double ์ˆซ์ž ๋ฐ์ดํ„ฐ, ์—ฐ์‚ฐ ํ•„์š”
scope2Tco2e Double ์ˆซ์ž ๋ฐ์ดํ„ฐ, ์—ฐ์‚ฐ ํ•„์š”
totalScope12Tco2e Double ๊ณ„์‚ฐ ๊ฒฐ๊ณผ (ํ•ฉ๊ณ„)
scope3Tco2e Double ์ˆซ์ž ๋ฐ์ดํ„ฐ, ์—ฐ์‚ฐ ํ•„์š”

๐Ÿ‘‰ **๋ฌธ์ž(์ด๋ฆ„)**์€ String,
๐Ÿ‘‰ **์ˆ˜์น˜(๋ฐฐ์ถœ๋Ÿ‰, ์ˆ˜์น˜๊ฐ’)**์€ Double.

 


                                     jpa์—์„œ entity๋ฅผ ์ƒ์„ฑ์ค‘์ธ๋ฐ, @Column์€ ์‚ญ์ œํ•ด๋„ ๋ ๊นŒ?์ฐธ๊ณ ๋กœ ์ž๋ฐ” 21๋ฒ„์ „์ด์•ผ

 

์•„์ฃผ ์ข‹์€ ์งˆ๋ฌธ์ด์—์š” ๐Ÿ‘
Java 21 ๋ฒ„์ „์ด๋“  ๊ทธ ์ดํ•˜ ๋ฒ„์ „์ด๋“ ,
์ด๊ฑด **JPA ์ŠคํŽ™(์ž๋ฐ” ๋ฒ„์ „๊ณผ๋Š” ๋ฌด๊ด€)**์— ๊ด€๋ จ๋œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.


โœ… ๊ฒฐ๋ก ๋ถ€ํ„ฐ ๋งํ•˜์ž๋ฉด

๐Ÿ‘‰ @Column์€ “ํ•„์ˆ˜”๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
JPA์—์„œ๋Š” ๋ช…์‹œํ•˜์ง€ ์•Š์•„๋„ ๊ธฐ๋ณธ ๋งคํ•‘ ๊ทœ์น™์— ๋”ฐ๋ผ ์ปฌ๋Ÿผ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.


๐Ÿ” ์ž์„ธํžˆ ์„ค๋ช…ํ•ด๋ณผ๊ฒŒ์š”

JPA์—์„œ @Entity ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๋ฉด,
JPA๊ฐ€ ํด๋ž˜์Šค์˜ ํ•„๋“œ๋ช…์„ ๊ทธ๋Œ€๋กœ DB ์ปฌ๋Ÿผ๋ช…์œผ๋กœ ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด:

 
@Entity public class User { @Id private Long id; private String name; private int age; }

์œ„์™€ ๊ฐ™์ด @Column์„ ์ „ํ˜€ ์“ฐ์ง€ ์•Š์•„๋„, JPA๋Š” ์ž๋™์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค ๐Ÿ‘‡

์ปฌ๋Ÿผ๋ช…ํƒ€์ž…
id bigint
name varchar
age integer

โš™๏ธ JPA ๊ธฐ๋ณธ ๋งคํ•‘ ๊ทœ์น™

ํ•ญ๋ชฉ๊ธฐ๋ณธ ๋™์ž‘
์ปฌ๋Ÿผ๋ช… ํ•„๋“œ๋ช…๊ณผ ๋™์ผ (camelCase → snake_case๋กœ ๋ณ€ํ™˜์€ ์„ค์ •์— ๋”ฐ๋ผ ๋‹ค๋ฆ„)
ํƒ€์ž… ํ•„๋“œ ํƒ€์ž…์— ๋งž๋Š” DB ํƒ€์ž… ์ž๋™ ๋งคํ•‘
์ œ์•ฝ ์กฐ๊ฑด ์ง€์ •ํ•˜์ง€ ์•Š์Œ (nullable, length ๋“ฑ์€ ๊ธฐ๋ณธ๊ฐ’ ์‚ฌ์šฉ)

๐Ÿงฉ ๊ทธ๋ž˜์„œ @Column์€ ์–ธ์ œ ํ•„์š”ํ• ๊นŒ?

@Column์€ ๊ธฐ๋ณธ ๋งคํ•‘ ๊ทœ์น™์„ ๋ฐ”๊พธ๊ณ  ์‹ถ์„ ๋•Œ๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ 1๏ธโƒฃ — ์ปฌ๋Ÿผ ์ด๋ฆ„ ๋ณ€๊ฒฝ

 
@Column(name = "user_name") private String name;

์˜ˆ์‹œ 2๏ธโƒฃ — NOT NULL ์ œ์•ฝ ์ถ”๊ฐ€

 
@Column(nullable = false) private String email;

์˜ˆ์‹œ 3๏ธโƒฃ — ๋ฌธ์ž์—ด ๊ธธ์ด ์ œํ•œ

 
@Column(length = 100) private String description;

์˜ˆ์‹œ 4๏ธโƒฃ — ์ˆซ์ž ์ •๋ฐ€๋„ ์ง€์ • (์˜ˆ: ๊ธˆ์•ก, ์˜จ์‹ค๊ฐ€์Šค ๋ฐฐ์ถœ๋Ÿ‰)

 
@Column(precision = 10, scale = 2) private Double totalTco2e;

โš ๏ธ ์ด๋Ÿฐ ์ œ์•ฝ์‚ฌํ•ญ์ด ์—†๋‹ค๋ฉด, @Column์€ ์—†์–ด๋„ ์ „ํ˜€ ๋ฌธ์ œ ์—†์Šต๋‹ˆ๋‹ค.


๐Ÿง  Java 21 ๊ธฐ์ค€ ์ฐธ๊ณ  ์‚ฌํ•ญ

  • Java 21์€ JPA์˜ ๋™์ž‘์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    (JPA๋Š” Java EE/Jakarta EE ์ŠคํŽ™ ๊ธฐ๋ฐ˜์ด๋ฏ€๋กœ ์ž๋ฐ” ๋ฒ„์ „๋ณด๋‹จ JPA ๋ฒ„์ „์ด ์ค‘์š”)
  • ์˜คํžˆ๋ ค Spring Boot 3.x๋ถ€ํ„ฐ๋Š” Jakarta Persistence (jakarta.persistence.Column) ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  •  
    import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.Id;

โœ… ๊ฒฐ๋ก  ์š”์•ฝ

์ƒํ™ฉ@Column ํ•„์š” ์—ฌ๋ถ€
ํ•„๋“œ๋ช…๊ณผ ์ปฌ๋Ÿผ๋ช…์ด ๊ฐ™๊ณ  ํŠน๋ณ„ํ•œ ์„ค์ •์ด ํ•„์š” ์—†์Œ โŒ ์ƒ๋žต ๊ฐ€๋Šฅ
์ปฌ๋Ÿผ๋ช… ๋ณ€๊ฒฝ, ์ œ์•ฝ ์กฐ๊ฑด ์ถ”๊ฐ€, ์ •๋ฐ€๋„ ์ง€์ • ํ•„์š” โœ… ๋ช…์‹œํ•ด์•ผ ํ•จ
null ํ—ˆ์šฉ ์—ฌ๋ถ€๋‚˜ ๊ธธ์ด ์ œํ•œ ๊ด€๋ฆฌ ํ•„์š” โœ… ๋ช…์‹œ ์ถ”์ฒœ

โœจ ์ฆ‰, “๊ธฐ๋ณธ ์„ค์ •์œผ๋กœ ์ถฉ๋ถ„ํ•˜๋‹ค๋ฉด ์ƒ๋žตํ•ด๋„ ์ „ํ˜€ ๋ฌธ์ œ์—†์Šต๋‹ˆ๋‹ค.”

 


 

์ถ”ํ›„์— ์Šคํ”„๋ง ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค๋กœ ๋„์ปค๋กœ ์ž‘๋™ํ•˜๋Š” ์‹œ์Šคํ…œ์„ ๊ฐœ๋ฐœํ•˜๋Š” ์ค‘์ด์•ผ ์„ค์ •ํŒŒ์ผ๋กœ ํ˜„์žฌ application.properits ์™€ application.yml ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•˜๋ ค๊ณ ํ•ด ๋„ˆ๋ผ๋ฉด ์–ด๋А๊ฒƒ์„ ์ถ”์ฒœํ•˜๊ณ , ์ด์œ ๋„ ์•Œ๋ ค์ค˜. ๋‚˜๋Š” ์ดˆ๋ณด์ž์•ผ.

 

์•„์ฃผ ์ข‹์€ ๊ณ ๋ฏผ์ด์—์š” ๐Ÿ‘
์Šคํ”„๋ง(Spring) ํ”„๋กœ์ ํŠธ์—์„œ ์„ค์ • ํŒŒ์ผ์„ **application.properties**๋กœ ํ• ์ง€, **application.yml**๋กœ ํ• ์ง€๋Š” ๊ฝค ์ค‘์š”ํ•œ ์„ ํƒ์ด์—์š” — ํŠนํžˆ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ๊ตฌ์กฐ์—์„œ ๋„์ปค(Docker)๋กœ ๋ฐฐํฌํ•  ๊ณ„ํš์ด๋ผ๋ฉด ๋”๋”์šฑ์š”.

์ดˆ๋ณด์ž ์ž…์žฅ์—์„œ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋น„๊ตํ•ด๋ณผ๊ฒŒ์š” ๐Ÿ‘‡


๐Ÿงฉ 1. ๋‘ ํ˜•์‹์˜ ์ฐจ์ด ๊ฐ„๋‹จ ์ •๋ฆฌ

๊ตฌ๋ถ„application.propertiesapplication.yml
ํ˜•ํƒœ ํ‚ค=๊ฐ’ (Key=Value) ํ˜•ํƒœ ๊ณ„์ธตํ˜• ๊ตฌ์กฐ (๋“ค์—ฌ์“ฐ๊ธฐ ๊ธฐ๋ฐ˜)
๊ฐ€๋…์„ฑ ๊ฐ„๋‹จํ•˜์ง€๋งŒ ๊ณ„์ธต ํ‘œํ˜„์ด ๋ถˆํŽธ ๊ตฌ์กฐ์ ์ด๋ผ ๋ณด๊ธฐ ์‰ฌ์›€
ํ™˜๊ฒฝ ๋ถ„๋ฆฌ ํ”„๋กœํŒŒ์ผ๋ณ„ ํŒŒ์ผ ๋ถ„๋ฆฌ ํ•„์š” (application-dev.properties ๋“ฑ) ๊ฐ™์€ ํŒŒ์ผ ์•ˆ์— ์—ฌ๋Ÿฌ ํ™˜๊ฒฝ ์ •์˜ ๊ฐ€๋Šฅ
๋ณต์žกํ•œ ์„ค์ • ๋ถˆํŽธํ•จ (๋ฐ˜๋ณต ๋งŽ์Œ) ๋งค์šฐ ํŽธ๋ฆฌ (๋ฐฐ์—ด, ๊ณ„์ธต ํ‘œํ˜„ ์‰ฌ์›€)
์‹ค์ˆ˜ ์œ„ํ—˜ ๋ฌธ๋ฒ•์ด ๋‹จ์ˆœํ•ด ์‹ค์ˆ˜ ์ ์Œ ๋“ค์—ฌ์“ฐ๊ธฐ ์ž˜๋ชปํ•˜๋ฉด ์˜ค๋ฅ˜ ๋ฐœ์ƒ
์ถ”์ฒœ ์šฉ๋„ ๋‹จ์ผ ์„œ๋น„์Šค, ์„ค์ • ๋‹จ์ˆœํ•  ๋•Œ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค, ๋ณต์žกํ•œ ํ™˜๊ฒฝ ์„ค์ • ์‹œ

๐Ÿ’ก 2. ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค + Docker ํ™˜๊ฒฝ ๊ธฐ์ค€์œผ๋กœ ์ถ”์ฒœ

๐Ÿ‘‰ ์ €๋ผ๋ฉด application.yml์„ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค.
๊ทธ ์ด์œ ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค:

โœ… 1) ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ๊ตฌ์กฐ์— ์œ ๋ฆฌ

  • ์—ฌ๋Ÿฌ ์„œ๋น„์Šค(์˜ˆ: user-service, order-service, auth-service)๊ฐ€ ๊ฐ๊ฐ ์„ค์ •์„ ๊ฐ–๊ฒŒ ๋˜์ฃ .
  • yml์€ ๊ณ„์ธตํ˜• ๊ตฌ์กฐ๋กœ ๊ฐ ์„œ๋น„์Šค์˜ ํ™˜๊ฒฝ, ํฌํŠธ, DB, ์™ธ๋ถ€ ์—ฐ๋™ ์„ค์ •์„ ๋ณด๊ธฐ ์‰ฝ๊ฒŒ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์š”.
 
server: port: 8081 spring: datasource: url: jdbc:mysql://db:3306/users username: user password: pass

→ ์ด๋Ÿฐ ์‹์œผ๋กœ ๊ณ„์ธต ๊ตฌ์กฐ๊ฐ€ ํ•œ๋ˆˆ์— ๋ณด์ž„.


โœ… 2) ๋„์ปค ํ™˜๊ฒฝ ๋ณ€์ˆ˜(Docker env)์™€์˜ ์—ฐ๋™์ด ์‰ฌ์›€

yml์€ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์น˜ํ™˜์ด ์ž์—ฐ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค ๐Ÿ‘‡

 
spring: datasource: url: jdbc:postgresql://${DB_HOST:localhost}:${DB_PORT:5432}/esgseeddb username: ${DB_USER:esgseed} password: ${DB_PASS:1234}

→ ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋„์ปค์—์„œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ์–ด์š”.
application.properties๋กœ ํ•˜๋ฉด ์ค„ ์ˆ˜๊ฐ€ ๋งŽ์•„์ง€๊ณ  ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ค์›Œ์ง‘๋‹ˆ๋‹ค.


โœ… 3) ํ”„๋กœํŒŒ์ผ๋ณ„ ์„ค์ • ๊ด€๋ฆฌ๊ฐ€ ํŽธํ•จ

yml์€ ํ•œ ํŒŒ์ผ ์•ˆ์—์„œ ์—ฌ๋Ÿฌ ํ™˜๊ฒฝ์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์–ด์š” ๐Ÿ‘‡

 
spring: profiles: active: dev --- spring: profiles: dev server: port: 8080 --- spring: profiles: prod server: port: 80

→ application.properties์—์„œ๋Š” ์ด๋Ÿฐ ๊ฑธ ํŒŒ์ผ ์—ฌ๋Ÿฌ ๊ฐœ๋กœ ๋‚˜๋ˆ ์•ผ ํ•ด์š” (application-dev.properties, application-prod.properties ๋“ฑ).


โœ… 4) ํ™•์žฅ์„ฑ ์ข‹์Œ

  • ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก properties ํ˜•์‹์€ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง‘๋‹ˆ๋‹ค.
  • yml์€ ๊ฐ ์„œ๋น„์Šค์˜ ์„ค์ •์„ ๋…ผ๋ฆฌ์ ์œผ๋กœ ๋ฌถ์–ด์„œ ๊ด€๋ฆฌํ•˜๊ธฐ ์‰ฌ์›Œ์š”.

โš ๏ธ ํ•˜์ง€๋งŒ ์ดˆ๋ณด์ž๋ผ๋ฉด...

yml์˜ ๋“ค์—ฌ์“ฐ๊ธฐ ์‹ค์ˆ˜๋Š” ์•„์ฃผ ํ”ํ•œ ํ•จ์ •์ด์—์š” ๐Ÿ˜…
๊ทธ๋ž˜์„œ ์ฒ˜์Œ์—๋Š” ์•„๋ž˜์ฒ˜๋Ÿผ ํ•˜์‹œ๋ฉด ์ข‹์•„์š”:

  1. application.yml๋กœ ์‹œ์ž‘ํ•˜๋˜,
  2. IntelliJ๋‚˜ VSCode์˜ YAML ๋ฌธ๋ฒ• ํ•˜์ด๋ผ์ดํŒ…์„ ์ผœ๋‘์„ธ์š”.
  3. ๋“ค์—ฌ์“ฐ๊ธฐ๋ฅผ ํƒญ(tab)์ด ์•„๋‹Œ ์ŠคํŽ˜์ด์Šค 2์นธ์œผ๋กœ ์œ ์ง€ํ•˜์„ธ์š”.

โœ… ๊ฒฐ๋ก  ์š”์•ฝ

ํ•ญ๋ชฉ์ถ”์ฒœ
์ดˆ๋ณด์ž + ๋‹จ์ผ ํ”„๋กœ์ ํŠธ application.properties (์ต์ˆ™ํ•˜๊ณ  ๋‹จ์ˆœ)
๋„์ปค + ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค + ํ™˜๊ฒฝ ๋ถ„๋ฆฌ โœ… application.yml ์ถ”์ฒœ
ํŒ€ ๊ฐœ๋ฐœ / ์œ ์ง€๋ณด์ˆ˜ ๊ณ ๋ ค yml์ด ๊ตฌ์กฐ์ ์ด๋ผ ํ˜‘์—…์— ์œ ๋ฆฌ

์š”์•ฝ

๐Ÿ‘‰ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค + Docker ํ™˜๊ฒฝ์ด๋ผ๋ฉด application.yml์ด ํ›จ์”ฌ ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
๊ตฌ์กฐ์ ์ด๊ณ , ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์—ฐ๋™์ด ์‰ฝ๊ณ , ํ™•์žฅ์„ฑ์ด ์ข‹์•„์š”.

 


๋‚˜ ์ง€๊ธˆ application.yml, ProjectController, ProjectEntity ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๊ฑฐ๊ณ  ๋ฌด์Šจ ๊ด€๋ จ์ด ์žˆ๋Š”์ง€ ์—ฐ๊ด€์„ ์•Œ๊ณ  ์‹ถ์–ด

 

 

application.yml, ProjectController, ๊ทธ๋ฆฌ๊ณ  ProjectEntity๋Š” Spring Boot ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ REST API๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ์ค‘์š”ํ•œ ๊ตฌ์„ฑ ์š”์†Œ๋“ค์ž…๋‹ˆ๋‹ค. ๊ฐ๊ฐ์˜ ์—ญํ• ๊ณผ ๊ทธ๋“ค์ด ์–ด๋–ป๊ฒŒ ์—ฐ๊ด€๋˜๋Š”์ง€ ๋‹จ๊ณ„์ ์œผ๋กœ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

1. application.yml

  • ์—ญํ• : application.yml์€ Spring Boot ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ค์ • ํŒŒ์ผ๋กœ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์ •๋ณด, Hibernate ์„ค์ •, ์„œ๋ฒ„ ํฌํŠธ ๋“ฑ ๋‹ค์–‘ํ•œ ๊ตฌ์„ฑ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค
  • ์—ฐ๊ด€์„ฑ:
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ: spring.datasource.url, spring.datasource.username, spring.datasource.password๋กœ Docker ๋‚ด esgseed ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ:
      yaml
       
      spring:
        datasource:
          url: jdbc:postgresql://localhost:5432/esgseed
          username: esgseed
          password: your_password
    • Hibernate ์„ค์ •: spring.jpa.hibernate.ddl-auto=update๋กœ ์—”ํ‹ฐํ‹ฐ ๊ธฐ๋ฐ˜ ํ…Œ์ด๋ธ” ์ƒ์„ฑ์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. hibernate.dialect๋Š” PostgreSQL์— ๋งž๊ฒŒ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.
      yaml
       
      spring:
        jpa:
          hibernate:
            ddl-auto: update
          properties:
            hibernate:
              dialect: org.hibernate.dialect.PostgreSQLDialect
    • ํšจ๊ณผ: ์ด ์„ค์ •์€ ProjectEntity๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ(project ํ…Œ์ด๋ธ”)๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

2. ProjectEntity

  • ์—ญํ• : ProjectEntity๋Š” JPA ์—”ํ‹ฐํ‹ฐ๋กœ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์˜ ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” Java ๊ฐ์ฒด์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ” ๊ฐ„ ๋งคํ•‘์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
  • ์˜ˆ์‹œ:
    java
     
    package com.seoeunjin.api.project.domain;
    
    import lombok.Data;
    import lombok.NoArgsConstructor;
    import lombok.AllArgsConstructor;
    import javax.persistence.Entity;
    import javax.persistence.Id;
    import javax.persistence.Table;
    
    @Entity
    @Table(name = "project")
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class Project {
        @Id
        private String site;
        private Double scope1Tco2e;
        private Double scope2Tco2e;
        private Double totalScope12Tco2e;
        private Double scope3Tco2e;
    }
  • ์—ฐ๊ด€์„ฑ:
    • application.yml๊ณผ์˜ ์—ฐ๊ด€: ddl-auto=update ์„ค์ • ๋•๋ถ„์— Spring Boot๊ฐ€ ์‹œ์ž‘๋  ๋•Œ Hibernate๊ฐ€ ์ด ์—”ํ‹ฐํ‹ฐ๋ฅผ ์Šค์บ”ํ•˜๊ณ  project ํ…Œ์ด๋ธ”์„ ์ž๋™ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ด๋ธ”์˜ ์—ด(site, scope1Tco2e ๋“ฑ)์€ ์—”ํ‹ฐํ‹ฐ์˜ ํ•„๋“œ์— ๋Œ€์‘๋ฉ๋‹ˆ๋‹ค.
    • ProjectController๊ณผ์˜ ์—ฐ๊ด€: ProjectEntity๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๊ฐ์ฒด๋กœ, ProjectController์—์„œ CRUD ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์ด ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•˜๊ฑฐ๋‚˜ ์ €์žฅํ•˜๋Š” ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

3. ProjectController

  • ์—ญํ• : ProjectController๋Š” REST API ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ •์˜ํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ฃผ๋กœ ProjectEntity๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ๋ถ€ํ„ฐ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ์ €์žฅํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
  • ์˜ˆ์‹œ:
    java
     
    package com.seoeunjin.api.project.controller;
    
    import com.seoeunjin.api.project.domain.Project;
    import org.springframework.web.bind.annotation.*;
    
    @RestController
    @RequestMapping("/projects")
    public class ProjectController {
        // ์˜์กด์„ฑ ์ฃผ์ž… (์˜ˆ: Repository)
        @Autowired
        private ProjectRepository repository;
    
        @GetMapping
        public List<Project> getAllProjects() {
            return repository.findAll();
        }
    
        @PostMapping
        public Project createProject(@RequestBody Project project) {
            return repository.save(project);
        }
    }
  • ์—ฐ๊ด€์„ฑ:
    • ProjectEntity์™€์˜ ์—ฐ๊ด€: ProjectController๋Š” Project ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ ์ˆ˜์‹ ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, getAllProjects()๋Š” ProjectRepository๋ฅผ ํ†ตํ•ด Project ์—”ํ‹ฐํ‹ฐ ๋ชฉ๋ก์„ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.
    • application.yml๊ณผ์˜ ์—ฐ๊ด€: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์„ค์ •(datasource)๊ณผ Hibernate ์„ค์ •์ด ์ œ๋Œ€๋กœ ๋˜์–ด ์žˆ์–ด์•ผ ProjectRepository๊ฐ€ ProjectEntity๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์—ฐ๊ฒฐ์ด ์‹คํŒจํ•˜๋ฉด ์ปจํŠธ๋กค๋Ÿฌ์˜ ์š”์ฒญ ์ฒ˜๋ฆฌ๋„ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

์ „์ฒด์ ์ธ ์—ฐ๊ด€์„ฑ:

  1. ์‹œ์ž‘์ : application.yml:
    • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹œ์ž‘๋  ๋•Œ application.yml์ด ๋กœ๋“œ๋˜์–ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(esgseed)์™€์˜ ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    • ddl-auto=update๋กœ ์ธํ•ด Hibernate๊ฐ€ ProjectEntity๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ project ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  2. ๋ฐ์ดํ„ฐ ๋ชจ๋ธ: ProjectEntity:
    • ProjectEntity๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ project ํ…Œ์ด๋ธ” ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•˜๋ฉฐ, Hibernate๊ฐ€ ์ด ๊ฐ์ฒด๋ฅผ ์Šค์บ”ํ•˜์—ฌ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค.
    • ์ด๋Š” ProjectController๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋ณธ ๋‹จ์œ„์ž…๋‹ˆ๋‹ค.
  3. ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค: ProjectController:
    • ํด๋ผ์ด์–ธํŠธ๊ฐ€ /projects ๊ฒฝ๋กœ๋กœ HTTP ์š”์ฒญ(์˜ˆ: GET, POST)์„ ๋ณด๋‚ด๋ฉด, ProjectController๊ฐ€ ProjectRepository๋ฅผ ํ†ตํ•ด ProjectEntity๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ฝ๊ฑฐ๋‚˜ ์“ฐ๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, POST /projects ์š”์ฒญ์œผ๋กœ ์ƒˆ๋กœ์šด Project ๊ฐ์ฒด๊ฐ€ ์ €์žฅ๋˜๋ฉด, Hibernate๊ฐ€ ์ด๋ฅผ project ํ…Œ์ด๋ธ”์— ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค.

์š”์•ฝ ๋‹ค์ด์–ด๊ทธ๋žจ:

text
 
application.yml (์„ค์ •)
   ↓
ProjectEntity (์—”ํ‹ฐํ‹ฐ → project ํ…Œ์ด๋ธ” ์ƒ์„ฑ)
   ↓
ProjectController (API ์—”๋“œํฌ์ธํŠธ → CRUD ์ฒ˜๋ฆฌ)
   ↓
ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ/์‘๋‹ต

์ถ”๊ฐ€ ๊ณ ๋ ค์‚ฌํ•ญ:

  • Repository: ProjectController๊ฐ€ ๋™์ž‘ํ•˜๋ ค๋ฉด ProjectRepository ์ธํ„ฐํŽ˜์ด์Šค(์˜ˆ: JpaRepository<Project, String>)๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” Spring Data JPA๊ฐ€ ์ž๋™์œผ๋กœ ๊ตฌํ˜„ํ•˜๋ฉฐ, application.yml์˜ ์„ค์ •์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.
  • ํŒจํ‚ค์ง€ ์Šค์บ”: ProjectEntity์™€ ProjectController๊ฐ€ Spring์— ์˜ํ•ด ์ธ์‹๋˜๋ ค๋ฉด ๊ฐ™์€ ํŒจํ‚ค์ง€(์˜ˆ: com.seoeunjin.api)๋‚˜ @ComponentScan ๋ฒ”์œ„ ๋‚ด์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

๐Ÿงฉ ์ •๋ฆฌํ•˜๋ฉด!

์—ฐ๊ฒฐ ์ˆœ์„œ์—ญํ• ์„ค๋ช…
1๏ธโƒฃ application.yml ํ™˜๊ฒฝ ์„ค์ • “DB๋Š” ์–ด๋””์— ์žˆ๊ณ , ์–ด๋–ค ๊ณ„์ •์œผ๋กœ ์—ฐ๊ฒฐํ• ์ง€” ์„ค์ •
2๏ธโƒฃ ProjectEntity ๋ฐ์ดํ„ฐ ์ •์˜ “DB์— ์–ด๋–ค ์ปฌ๋Ÿผ๋“ค์ด ์žˆ๋Š”์ง€” ์ •์˜
3๏ธโƒฃ ProjectController ์š”์ฒญ ์ฒ˜๋ฆฌ “์‚ฌ์šฉ์ž ์š”์ฒญ์„ ๋ฐ›์•„์„œ, Entity ๋ฐ์ดํ„ฐ๋ฅผ ๊บผ๋‚ด์™€ ๋ณด์—ฌ์คŒ”

์ฆ‰,
๐Ÿ‘‰ application.yml์ด ํ™˜๊ฒฝ์„ ์„ธํŒ…ํ•˜๊ณ 
๐Ÿ‘‰ ProjectEntity๊ฐ€ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œํ˜„ํ•˜๊ณ 
๐Ÿ‘‰ ProjectController๊ฐ€ ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ „๋‹ฌํ•˜๋Š” ๊ตฌ์กฐ์˜ˆ์š”!