๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Project ESG+AI/[์‚ผ์ •KPMG]ESG ๋ฐ์ดํ„ฐ ํ™œ์šฉ ํ’€์Šคํ… ๊ฐœ๋ฐœ

3์ผ์ฐจ. ๋‚ด๊ฐ€ ๋งŒ๋“ค๊ณ  ์‹ถ์€ ์‚ฌ์ดํŠธ ๋งŒ๋“ค๊ธฐ

by GreenJin_S2 2025. 10. 13.

api ๋จผ์ €!

 

์šฐํด๋ฆญํ•ด์„œ open git bash here

 

์ฐฝ๋œจ๋ฉด cursor . (ํ•œ ์นธ ๋„์šฐ๊ธฐ!)

 

 

* ๋ฌธ์„œ-demoํŒŒ์ผ์—์„œ ๋ชจ๋“  ํŒŒ์ผ! ๋‹ค ! src ํŒŒ์ผ ๋ณต์‚ฌํ•˜๊ณ  ๋‚ด๊ฐ€ ๋งŒ๋“  api ํŒŒ์ผ์— ๋ถ™์—ฌ๋„ฃ๊ธฐ! 

 

์›์ž/ ๋ถ„์ž

๋”์ด์ƒ ์ชผ๊ฐค ์ˆ˜ ์—†๋Š” ์ง€์ 

 

์ด๋ ‡๊ฒŒ ๋‘๊ฐœ ๋‚˜๋ˆ ์ง

 

 

 

* static-์ด๋ฏธ์ง€

* templates-html๋งŒ ๋“ค์–ด๊ฐ

ํด๋” ๋งŒ๋“ค๊ธฐ images/ styles

ํด๋” ๋งŒ๋“ค๊ธฐ images/ styles

 

 

๋งŒ๋“ค๊ณ  ์‹ถ์€ ์ปจ์…‰์œผ๋กœ ํ™ˆํŽ˜์ด์ง€ ํ•˜๋‚˜ ๋งŒ๋“ค๊ธฐ 

-์ธ๋ฑ์Šค๊ฐ€ ์ ค ํฐ ๊ฐœ๋…์ž„ index

 

auth ํด๋” ๋งŒ๋“ค๊ธฐ
indexํŒŒ์ผ ๋งŒ๋“ค๊ธฐ

 

์ฑ„ํŒ… ์•ˆ๋‚˜์˜ค๋ฉด ์ด๋ ‡๊ฒŒ ๋ˆ„๋ฅด๊ธฐ

 

 

 

๋ช…๋ น์–ด๋กœ- ์˜จ์‹ค๊ฐ€์Šค ๋ฐฐ์ถœ๋Ÿ‰ ์‚ฐ์ • ์‚ฌ์ดํŠธ ๋งŒ๋“ค์–ด์ค˜๋ผ๊ณ  ํ–ˆ์Œ

 

 

๋Œ€๋‹จ์Šค.. ๊ทผ๋ฐ ์ด๋ ‡๊ฒŒ ์‚ฐ์ •ํ•˜๋Š”๊ฑฐ ๋งž๋‚˜??

 

 

 

ํ…œํ”Œ๋ฆฟ์— ์ด์ง„๋ถ„๋ฅ˜๋ฒ•์œผ๋กœ ์ธ๋ฑ์Šค ํŒŒ์ผ๊ณผ ํด๋”๋กœ ์–‘๋ถ„ํ•œ ํ›„ ํ”„๋กฌํ”„ํŠธ๋กœ ์ธ๋ฑ์Šค ํŒŒ์ผ์„ ์ƒ์„ฑํ•จ. index.html ์— ๊ด‘๊ณ  ๋Œ€ํ–‰์‚ฌ ํ™ˆํŽ˜์ด์ง€๋ฅผ mvp ๋กœ ์ƒ์„ฑํ•˜๋ ค๊ณ  ํ•ด. ์Šคํฌ๋ฆฝํŠธ ์—†์ด, ๊ด‘๊ณ ๋Œ€ํ–‰์‚ฌ ์ธํŠธ๋กœ ํ™”๋ฉด์„ ์ฝ”๋”ฉํ•ด์ค˜. 251013

 

 

 

 

 

์ด ํŒŒ์ผ์„ html๋กœ ์‹คํ–‰ํ•œ ๊ฒƒ์€ ์ž˜ ๋˜๋Š”๋ฐ, localhost ๋กœ ์‹คํ–‰ํ•œ ๊ฒƒ์€ ์ด๋ ‡๊ฒŒ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์ด์œ ๋ฅผ ์•Œ๋ ค์ฃผ๊ณ , ์ž‘์—…๊ณผ์ •์„ ์„ค๋ช…๋งŒ ํ•˜๊ณ , ์ ์šฉ์€ ํ•˜์ง€ ๋ง์•„์ค˜

 

 

localhost์—์„œ ์—ฐ๊ฒฐ์ด ๊ฑฐ๋ถ€๋˜๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ด์œ ์™€ ํ•ด๊ฒฐ ๊ณผ์ •์„ ์„ค๋ช…๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

๐Ÿ” ์—๋Ÿฌ ์›์ธ ๋ถ„์„

1. ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š์Œ

  • Spring Boot ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰๋˜์ง€ ์•Š์€ ์ƒํƒœ
  • localhost:8080์— ์„œ๋ฒ„๊ฐ€ ๋ฐ”์ธ๋”ฉ๋˜์ง€ ์•Š์Œ
  • ๋ฐฑ์—”๋“œ ์„œ๋ฒ„ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ค‘๋‹จ๋œ ์ƒํƒœ

2. ํฌํŠธ ์ถฉ๋Œ

  • 8080 ํฌํŠธ๊ฐ€ ๋‹ค๋ฅธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์˜ํ•ด ์‚ฌ์šฉ ์ค‘
  • ๋ฐฉํ™”๋ฒฝ์ด๋‚˜ ๋ณด์•ˆ ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ํฌํŠธ๋ฅผ ์ฐจ๋‹จ

3. Spring Boot ์„ค์ • ๋ฌธ์ œ

  • application.properties ์„ค์ • ์˜ค๋ฅ˜
  • ์„œ๋ฒ„ ํฌํŠธ ์„ค์ • ๋ฌธ์ œ
  • ํ…œํ”Œ๋ฆฟ ์—”์ง„ ์„ค์ • ๋ฌธ์ œ

๐Ÿ› ๏ธ ํ•ด๊ฒฐ ๊ณผ์ • (์ž‘์—… ์ˆœ์„œ)

1๋‹จ๊ณ„: ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ํ™•์ธ

 

2๋‹จ๊ณ„: Spring Boot ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํด๋ž˜์Šค ํ™•์ธ

 

3๋‹จ๊ณ„: ์ปจํŠธ๋กค๋Ÿฌ ์ƒ์„ฑ

 

4๋‹จ๊ณ„: ์„œ๋ฒ„ ์‹คํ–‰

 

5๋‹จ๊ณ„: ๋ธŒ๋ผ์šฐ์ € ์ ‘์†

 

๐Ÿ“‹ ํ•„์š”ํ•œ ์ž‘์—… ๋ชฉ๋ก

A. ๋ฐฑ์—”๋“œ ์„ค์ •

  1. ์ปจํŠธ๋กค๋Ÿฌ ํด๋ž˜์Šค ์ƒ์„ฑ
  • src/main/java/com/example/controller/HomeController.java
  • ๊ฐ ํƒญ์— ๋Œ€ํ•œ ๋งคํ•‘ ์ถ”๊ฐ€
  1. application.properties ์„ค์ •
  • ์„œ๋ฒ„ ํฌํŠธ ์„ค์ •
  • Thymeleaf ์„ค์ •
  1. ์˜์กด์„ฑ ํ™•์ธ
  • build.gradle์— Spring Web, Thymeleaf ์˜์กด์„ฑ

B. ํ…œํ”Œ๋ฆฟ ๊ฒฝ๋กœ ์ˆ˜์ •

  1. ํ…œํ”Œ๋ฆฟ ํŒŒ์ผ ์œ„์น˜ ํ™•์ธ
  • src/main/resources/templates/ ํ•˜์œ„์— ์œ„์น˜
  • ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์˜ฌ๋ฐ”๋ฅธ ๊ฒฝ๋กœ ๋ฐ˜ํ™˜
  1. ์ •์  ๋ฆฌ์†Œ์Šค ์„ค์ •
  • CSS, JS ํŒŒ์ผ์„ src/main/resources/static/์— ๋ฐฐ์น˜

C. ์„œ๋ฒ„ ์‹คํ–‰ ๋ฐ ํ…Œ์ŠคํŠธ

  1. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰
  1. ํฌํŠธ ํ™•์ธ
  1. ๋ธŒ๋ผ์šฐ์ € ์ ‘์† ํ…Œ์ŠคํŠธ

๐ŸŽฏ ํ•ต์‹ฌ ํฌ์ธํŠธ

HTML ํŒŒ์ผ์„ ์ง์ ‘ ๋ธŒ๋ผ์šฐ์ €๋กœ ์—ด๋ฉด:

  • ์ •์  HTML ํŒŒ์ผ๋กœ ๋™์ž‘
  • JavaScript ๊ธฐ๋Šฅ์€ ์ž‘๋™
  • ์„œ๋ฒ„ ์—†์ด ๋กœ์ปฌ ํŒŒ์ผ ์‹œ์Šคํ…œ์—์„œ ์‹คํ–‰

localhost:8080์œผ๋กœ ์ ‘์†ํ•˜๋ฉด:

  • Spring Boot ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰๋˜์–ด์•ผ ํ•จ
  • ํ…œํ”Œ๋ฆฟ ์—”์ง„์ด HTML์„ ๋ Œ๋”๋ง
  • ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๊ธฐ๋Šฅ ํ™œ์šฉ ๊ฐ€๋Šฅ

ํ˜„์žฌ ์ƒํ™ฉ์—์„œ๋Š” Spring Boot ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ localhost์— ์ ‘์†ํ•˜๋ ค๊ณ  ํ•ด์„œ ์—ฐ๊ฒฐ์ด ๊ฑฐ๋ถ€๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

 

 


localhost:8080 ์—๋Ÿฌ ๋ฐœ์ƒ ์ด์œ 

ERR_CONNECTION_REFUSED ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ด์œ ๋Š”:
์›น ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š์Œ - Spring Boot ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์•„์ง ์‹œ์ž‘๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค

ํฌํŠธ 8080์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†์Œ - localhost:8080์œผ๋กœ ์ ‘๊ทผํ•˜๋ ค๊ณ  ํ•˜์ง€๋งŒ ์„œ๋ฒ„๊ฐ€ ํ•ด๋‹น ํฌํŠธ์—์„œ ๋Œ€๊ธฐํ•˜๊ณ  ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค

์ •์  ํŒŒ์ผ ์„œ๋น™ ์„ค์ • ๋ถ€์กฑ - Spring Boot์—์„œ HTML ํŒŒ์ผ์„ ์ •์  ๋ฆฌ์†Œ์Šค๋กœ ์„œ๋น™ํ•˜๋Š” ์„ค์ •์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

ํ•ด๊ฒฐ์„ ์œ„ํ•œ ์ž‘์—… ๊ณผ์ •

1๋‹จ๊ณ„ ๐Ÿˆ Spring Boot ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ™•์ธ# ํ˜„์žฌ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ํ™•์ธls -la src/main/java/com/labzang/api/

2๋‹จ๊ณ„ ๐Ÿˆ Spring Boot ์„œ๋ฒ„ ์‹œ์ž‘#

๐Ÿ’ฅ Gradle์„ ์‚ฌ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰
./gradlew bootRun
๋˜๋Š” Windows์—์„œgradlew.bat bootRun

3๋‹จ๊ณ„ ๐Ÿˆ ์ •์  ๋ฆฌ์†Œ์Šค ์„ค์ • ํ™•์ธ

src/main/resources/application.properties ํŒŒ์ผ์— ๋‹ค์Œ ์„ค์ • ์ถ”๊ฐ€:

# ์ •์  ๋ฆฌ์†Œ์Šค ๊ฒฝ๋กœ ์„ค์ •spring.web.resources.static-locations=classpath:/static/,classpath:/templates/spring.mvc.view.prefix=classpath:/templates/spring.mvc.view.suffix=.html
-๋ฌด์ž‘์ • ๊ฐ€์ ธ๋‹ค ๋ถ™์ธ๋‹ค๊ณ  ๋˜์ง€ ์•Š์Œ.

:/ ํด๋ ˆ์ด์Šค์ŠคํŽ˜์ด์Šค์— ์™œ ์ฝœ๋ก ์„ ๋ถ™์—ฌ์•ผํ•ด?

classpath : Java์—์„œ ํด๋ž˜์Šค๋‚˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์ฐพ๋Š” ๊ฒฝ๋กœ(path)๋ฅผ ์˜๋ฏธ

๋ฆฌ์†Œ์Šค ํŒŒ์ผ๋“ค์„ ์ž๋ฐ”๋กœ ๋ถˆ๋Ÿฌ๋‚ด๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•จ

:/ :  is(be ๋™์‚ฌ)

“ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์˜ classpath ๋ฃจํŠธ(root)๋กœ๋ถ€ํ„ฐ ํŒŒ์ผ์„ ์ฐพ์•„๋ผ.”

์ฆ‰,

  • classpath: → "ํด๋ž˜์ŠคํŒจ์Šค ์•ˆ์—์„œ ์ฐพ๋Š”๋‹ค"
  • / → "๋ฃจํŠธ(๋งจ ์ฒ˜์Œ ๊ฒฝ๋กœ)๋ถ€ํ„ฐ ์ฐพ๋Š”๋‹ค"

 
4๋‹จ๊ณ„ ๐Ÿˆ ์ปจํŠธ๋กค๋Ÿฌ ์ƒ์„ฑ (์„ ํƒ์‚ฌํ•ญ)

src/main/java/com/labzang/api/controller/HomeController.java ์ƒ์„ฑ:
@Controllerpublic class HomeController {
@GetMapping
("/")public String home() {return "index";}}

5๋‹จ๊ณ„ ๐Ÿˆ ์„œ๋ฒ„ ์‹คํ–‰ ํ›„ ์ ‘๊ทผ

์„œ๋ฒ„๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์‹œ์ž‘๋˜๋ฉด http://localhost:8080์œผ๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅ
์ฝ˜์†”์—์„œ "Started ApiApplication" ๋ฉ”์‹œ์ง€ ํ™•์ธ

ํ˜„์žฌ ์ƒํ™ฉ
โœ… HTML ํŒŒ์ผ ์ง์ ‘ ์‹คํ–‰: ์ •์ƒ ์ž‘๋™ (ํŒŒ์ผ ์‹œ์Šคํ…œ์—์„œ ์ง์ ‘ ์—ด๊ธฐ)
โŒ localhost:8080 ์ ‘๊ทผ: ์‹คํŒจ (์›น ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š์Œ)

Spring Boot ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๐Ÿ‘‰๋จผ์ € ์‹คํ–‰ ํ•ด์•ผ 

์›น ์„œ๋ฒ„๊ฐ€ ์‹œ์ž‘๋˜๊ณ  localhost๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!


์ปดํŒŒ์ผ๋ง ํ•˜๋Š” ์ด์œ ? ๋„๋ฉ”์ธ์— ์˜ฌ๋ฆด๋ ค๊ณ ,  web ์„œ๋ธŒ์— ์˜ฌ๋ฆฌ๋ ค๊ณ , 

 

์ธํ„ฐํ”„๋ฆญํŒ… ์•ˆํ•˜๊ณ  ๋กœ์ปฌ๋กœ ๋ฐ”๋กœ ๊ฐ€๋ ค๊ณ  ํ•˜๋Š” ๊ฒƒ์ž„

 

๋ฐ•๋ฏผ์†”/์šฐ์ •์œค/์„œ์€์ง„

 

์œˆ๋„์šฐ+r -> cmd

java --version

 

์™ธ๊ตญ์–ด ์–ด๋ ต์ง€๋งŒ ์ด ๋‚ด์šฉ๋“œ๋ฅธ ์•Œ์•„์•ผํ•จ

 

 

 

 

spring.application.name=api
spring.mvc.view.prefix=/
spring.mvc.view.suffix=.html
 
์ด๋ ‡๊ฒŒ ์“ฐ๊ธฐ!

 

 


@HomeController.java
์—ฌ๊ธฐ์— @ApiApplication.java ์ด๊ฒƒ์„ ์‹คํ–‰ํ•˜๋ฉด, @index.html ์ด๊ฒƒ์ด ๋ธŒ๋ผ์šฐ์ €์— ๋ณด์—ฌ์ง€๊ธฐ๋ฅผ ์›ํ•ด. ์ด๋ ‡๊ฒŒ ์ฝ”๋“œ๋งŒ ์ž‘์„ฑํ•ด์ค˜, ์‹คํ–‰์€ ๋‚ด๊ฐ€ ํ• ๊ฑฐ์•ผ.

 

api~~ํŒŒ์ผ์—์„œ -run๋ˆ„๋ฅด๊ธฐ

 

 

์—‘์„ธ์Šค ํ—ˆ์šฉ

 

 

๋กœ๊ทธ์ธ์ฐฝ ๋งŒ๋“ค๊ธฐ

 

 

ํŒŒ์ผ๋งŒ๋“ค๊ธฐ css

 

 

์ธ๋ฑ์Šค ๋ถ€๋ถ„์˜ style ๋ถ€๋ถ„๋งŒ ๋ถ™์—ฌ๋„ฃ๊ธฐ

 

 


@index.html
์—ฌ๊ธฐ์— @index.css ๋ฅผ ์ธ๋ผ์ธ๋ฐฉ์‹์œผ๋กœ ์ž„ํฌํŠธํ•˜๋„๋ก ์ˆ˜์ •ํ•ด์ค˜.

 



@index.html
์—ฌ๊ธฐ์— @index.css ๋ฅผ ์ธ๋ผ์ธ๋ฐฉ์‹์œผ๋กœ ์ž„ํฌํŠธํ•˜๋„๋ก ์ˆ˜์ •ํ•ด์ค˜.

๋ฌธ์žฅ ํ•ด์„

“@index.html ์—ฌ๊ธฐ์— @index.css ๋ฅผ ์ธ๋ผ์ธ ๋ฐฉ์‹์œผ๋กœ ์ž„ํฌํŠธํ•˜๋„๋ก ์ˆ˜์ •ํ•ด์ค˜.”

์ด ๋ง์€ ์ฆ‰,

“HTML ํŒŒ์ผ(index.html)์— ์žˆ๋Š” ๋‚ด์šฉ์„ ๋ฐ”๊ฟ”์„œ,
๋ณ„๋„๋กœ ์กด์žฌํ•˜๋˜ CSS ํŒŒ์ผ(index.css)์˜ ์Šคํƒ€์ผ์„ HTML ์•ˆ์— ์ง์ ‘ ํฌํ•จ์‹œํ‚ค๋„๋ก ํ•ด๋‹ฌ๋ผ
๋Š” ๋œป์ด์—์š”.

 

“์ธ๋ผ์ธ ๋ฐฉ์‹์œผ๋กœ ์ž„ํฌํŠธ”๊ฐ€ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ

“์ธ๋ผ์ธ(inline)”์ด๋ž€ HTML ํŒŒ์ผ ์•ˆ์— ์ง์ ‘ ์Šคํƒ€์ผ์„ ์จ๋„ฃ๋Š” ๋ฐฉ์‹์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰,
<link>๋กœ ๋ถˆ๋Ÿฌ์˜ค์ง€ ์•Š๊ณ  HTML ์•ˆ์— <style> ํƒœ๊ทธ๋กœ CSS ๋‚ด์šฉ์„ ํฌํ•จ์‹œํ‚ค๋Š” ๊ฒƒ์ด์—์š”.

 


๋กœ๊ทธ์ธ์ด๋ž‘ ํšŒ์›๊ฐ€์ž… ๋ฒ„ํŠผ ๋งŒ๋“ค๊ธฐ- chat gpt์— ๋ฌผ์–ด๋ด„

 

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>ํƒ„์†Œ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ - ๋กœ๊ทธ์ธ</title>
    <link rel="stylesheet" th:href="@{/styles/index.css}">
    <style>
        /* ๊ธฐ์กด ์Šคํƒ€์ผ ์œ ์ง€ */
        * { margin: 0; padding: 0; box-sizing: border-box; }

        body {
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
            background: linear-gradient(135deg, #1e3c72 0%, #2a5298 100%);
            min-height: 100vh;
            color: #333;
        }

        .header {
            background: linear-gradient(135deg, #2c3e50 0%, #34495e 100%);
            color: white;
            padding: 30px 0;
            text-align: center;
            box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);
        }

        .header h1 {
            font-size: 2.8rem;
            margin-bottom: 10px;
            font-weight: 700;
        }

        .header p {
            font-size: 1.2rem;
            opacity: 0.9;
        }

        .container {
            max-width: 1400px;
            margin: 0 auto;
            padding: 30px 20px;
        }

        /* ๐Ÿ”ฝ ๋กœ๊ทธ์ธ ๊ด€๋ จ ์Šคํƒ€์ผ ์ถ”๊ฐ€ */
        .login-section {
            display: flex;
            justify-content: center;
            align-items: center;
            min-height: 70vh;
        }

        .login-box {
            background-color: white;
            padding: 2rem;
            border-radius: 15px;
            width: 320px;
            box-shadow: 0 5px 15px rgba(0, 0, 0, 0.2);
            text-align: center;
        }

        .login-box input {
            width: 100%;
            padding: 10px;
            margin-bottom: 1rem;
            border: 1px solid #ccc;
            border-radius: 8px;
        }

        .login-box button {
            width: 100%;
            background-color: #1e3c72;
            color: white;
            padding: 10px;
            border: none;
            border-radius: 8px;
            cursor: pointer;
        }

        .login-box button:hover {
            background-color: #2a5298;
        }
    </style>
</head>

<body>
    <header class="header">
        <h1>ํƒ„์†Œ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ</h1>
        <p>์˜จ์‹ค๊ฐ€์Šค ๋ฐฐ์ถœ๋Ÿ‰ ์‚ฐ์ • & LCA & ๊ณต์‹œ ๊ธฐ์ค€</p>
    </header>

    <div class="container">
        <section class="login-section">
            <div class="login-box">
                <h2>๋กœ๊ทธ์ธ</h2>
                <form id="loginForm">
                    <input type="email" id="email" placeholder="์ด๋ฉ”์ผ" required>
                    <input type="password" id="password" placeholder="๋น„๋ฐ€๋ฒˆํ˜ธ" required>
                    <button type="submit">๋กœ๊ทธ์ธ</button>
                </form>
                <p>์•„์ง ํšŒ์›์ด ์•„๋‹ˆ์‹ ๊ฐ€์š”? <a href="/signup">ํšŒ์›๊ฐ€์ž…</a></p>
            </div>
        </section>
    </div>

    <script>
    document.getElementById("loginForm").addEventListener("submit", async (e) => {
      e.preventDefault();
      const email = document.getElementById("email").value;
      const password = document.getElementById("password").value;

      const res = await fetch("/api/login", {
        method: "POST",
        headers: {"Content-Type": "application/json"},
        body: JSON.stringify({ email, password }),
      });

      const data = await res.json();
      if (res.ok) {
        alert("๋กœ๊ทธ์ธ ์„ฑ๊ณต!");
        localStorage.setItem("token", data.token);
        window.location.href = "/";
      } else {
        alert(data.message || "๋กœ๊ทธ์ธ ์‹คํŒจ");
      }
    });
    </script>
</body>
</html>


    <nav class="navbar">
        <ul>
          <li><a href="/">ํ™ˆ</a></li>
          <li><a href="/about">์†Œ๊ฐœ</a></li>
          <li><a href="/lca">LCA ๋ถ„์„</a></li>
          <li><a href="/emission">์˜จ์‹ค๊ฐ€์Šค ์‚ฐ์ •</a></li>
          <li><a href="/report">๊ณต์‹œ ๋ฆฌํฌํŠธ</a></li>
          <li><a href="/login">๋กœ๊ทธ์ธ</a></li>
          <li><a href="/register">ํšŒ์›๊ฐ€์ž…</a></li>
        </ul>
      </nav>
 

-์ด๊ฑฐ๋ฅผ ๋„ฃ์–ด๋ด„

 

home์„ api์•ˆ์— ๋„ฃ๊ธฐ ์˜ฎ๊ธฐ๊ธฐ, run๋ˆ„๋ฅด๊ธฐ

 

http://localhost:8080/

์ด๋ ‡๊ฒŒ ๋„ฃ์–ด์„œ ์‹œ์Šคํ…œ ๋œจ๋Š”์ง€ ํ™•์ธํ•ด์•ผํ•จ!

 

auth์— ๋‘ ๊ฐœ ํŒŒ์ผ ์ถ”๊ฐ€


@login.html
๋กœ๊ทธ์ธ ํ™”๋ฉด์„ ์ž‘์„ฑํ•ด์ค˜


@register.html
์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ, ์ด๋ฆ„, ์ด๋ฉ”์ผ์„ ์ž…๋ ฅํ•˜๋Š” ํšŒ์›๊ฐ€์ž…ํŽ˜์ด์ง€๋ฅผ ์ƒ์„ฑํ•ด์ค˜. ์Šคํฌ๋ฆฝํŠธ๋Š” ์‚ฌ์šฉํ•˜์ง€ ๋ง์•„์ค˜

 

 

 

 

@ ๋ˆŒ๋Ÿฌ์„œ ๋‘๊ฐœ ์ถ”๊ฐ€ํ•จ

 


๋žฉ์žฅ
@lab_zang
<header>
<nav>
<div class="logo">Creative Hub</div>
<ul class="nav-links">
<li><a href="#home">ํ™ˆ</a></li>
<li><a href="/auth/login">๋กœ๊ทธ์ธ</a></li>
<li><a href="/auth/register">ํšŒ์›๊ฐ€์ž…</a></li>
</ul>
</nav>
</header>

<!-- ํžˆ์–ด๋กœ ์„น์…˜ -->
<section class="hero" id="home">
<div class="hero-content">
<li><a href="#home">๋ง์…ˆ </a></li>
<li><a href="/auth/login">๋บ„์…ˆ</a></li>
<li><a href="/auth/register">๊ณฑ์…ˆ</a></li>
<li><a href="/auth/register">๋‚˜๋ˆ—์…ˆ</a></li>
</div>
</section>

๊ณ„์‚ฐ๊ธฐ ํ…œํ”Œ๋ฆฟ -> ๋ฌธ์ œ ํ•ด๊ฒฐ์šฉ .์ƒ˜ํ”ŒํŒŒ์ผ 

<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>๊ณ„์‚ฐ๊ธฐ - Creative Hub</title>
</head>
<body>
<a href="/" class="back-link">
← ํ™ˆ์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ
</a>
<div class="login-container">
<div class="login-header">

<h1>๊ณฑ์…ˆ</h1>
</div>
</div>
</body>
</html>

 

 

๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„!!!!!

 

**home ์— ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ์ด @์™€ ์—ฐ๊ฒฐ๋˜๋„๋ก ๊ตฌ์„ฑํ•ด์•ผ ๊ทธ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„๋•Œ ๋„˜์–ด๊ฐ

 

 

 

์ด์— ๋Œ€ํ•œ ๋‚ด์šฉ์€ ์ฑ— ์ง€ํ”ผํ‹ฐ์— ๋ถ€ํƒํ–ˆ์Œ

<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>ํšŒ์‚ฌ ์†Œ๊ฐœ | ํƒ„์†Œ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ</title>
  <link rel="stylesheet" href="/styles/index.css" />
  <style>
    body {
      font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
      background: linear-gradient(135deg, #1e3c72 0%, #2a5298 100%);
      color: #fff;
      margin: 0;
      padding: 0;
    }

    .header {
      background: linear-gradient(135deg, #2c3e50 0%, #34495e 100%);
      padding: 30px 0;
      text-align: center;
      box-shadow: 0 4px 20px rgba(0,0,0,0.2);
    }

    .header h1 {
      font-size: 2.5rem;
      margin-bottom: 10px;
      color: #fff;
    }

    nav {
      background-color: rgba(255,255,255,0.1);
      backdrop-filter: blur(10px);
      text-align: center;
      padding: 15px 0;
    }

    nav ul {
      list-style: none;
      display: flex;
      justify-content: center;
      gap: 30px;
      padding: 0;
      margin: 0;
    }

    nav a {
      color: #fff;
      text-decoration: none;
      font-weight: 600;
      transition: color 0.3s;
    }

    nav a:hover {
      color: #ffd700;
    }

    .container {
      max-width: 1000px;
      margin: 0 auto;
      padding: 50px 20px;
    }

    .section {
      background-color: rgba(255,255,255,0.1);
      border-radius: 15px;
      padding: 30px;
      margin-bottom: 40px;
      box-shadow: 0 4px 10px rgba(0,0,0,0.2);
    }

    .section h2 {
      color: #ffd700;
      margin-bottom: 15px;
      font-size: 1.8rem;
      border-bottom: 2px solid rgba(255,255,255,0.3);
      padding-bottom: 8px;
    }

    .section p {
      line-height: 1.7;
      color: #f3f3f3;
    }
  </style>
</head>
<body>

  <header class="header">
    <h1>ํšŒ์‚ฌ ์†Œ๊ฐœ</h1>
    <p>์ง€์† ๊ฐ€๋Šฅํ•œ ๋ฏธ๋ž˜๋ฅผ ์œ„ํ•œ ํƒ„์†Œ ๊ด€๋ฆฌ ์†”๋ฃจ์…˜</p>
  </header>

  <!-- โœ… ๋„ค๋น„๊ฒŒ์ด์…˜ -->
  <nav>
    <ul>
      <li><a href="/">ํ™ˆ</a></li>
      <li><a href="/about" class="active">์†Œ๊ฐœ</a></li>
      <li><a href="/lca">LCA ๋ถ„์„</a></li>
      <li><a href="/emission">์˜จ์‹ค๊ฐ€์Šค ์‚ฐ์ •</a></li>
      <li><a href="/report">๊ณต์‹œ ๋ฆฌํฌํŠธ</a></li>
      <li><a href="/login">๋กœ๊ทธ์ธ</a></li>
      <li><a href="/signup">ํšŒ์›๊ฐ€์ž…</a></li>
    </ul>
  </nav>

  <!-- โœ… ๋ณธ๋ฌธ ๋‚ด์šฉ -->
  <div class="container">

    <!-- ํšŒ์‚ฌ ์†Œ๊ฐœ -->
    <section class="section">
      <h2>ํšŒ์‚ฌ ์†Œ๊ฐœ</h2>
      <p>
        ์ €ํฌ <strong>ํƒ„์†Œ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ</strong>์€ ๊ธฐ์—…๊ณผ ๊ธฐ๊ด€์ด ESG ์‹œ๋Œ€์— ๋งž์ถฐ 
        ์ฒด๊ณ„์ ์œผ๋กœ <strong>ํƒ„์†Œ์ค‘๋ฆฝ ์ „๋žต</strong>์„ ์ˆ˜๋ฆฝํ•˜๊ณ  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๋Š” 
        ํ™˜๊ฒฝ ๊ธฐ์ˆ  ๊ธฐ๋ฐ˜ ํ”Œ๋žซํผ์ž…๋‹ˆ๋‹ค.  
        ์˜จ์‹ค๊ฐ€์Šค ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ๋ถ€ํ„ฐ LCA ๋ถ„์„, ๊ณต์‹œ ๋ฆฌํฌํŠธ ์ž๋™ํ™”๊นŒ์ง€  
        ์›์Šคํ†ฑ์œผ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
      </p>
    </section>

    <!-- ํƒ„์†Œ์ค‘๋ฆฝ -->
    <section class="section">
      <h2>ํƒ„์†Œ์ค‘๋ฆฝ(Carbon Neutrality)</h2>
      <p>
        ํƒ„์†Œ์ค‘๋ฆฝ์€ ๋ฐฐ์ถœ๋œ ์˜จ์‹ค๊ฐ€์Šค์˜ ์ด๋Ÿ‰์„ ๊ฐ์ถ•ํ•˜๊ฑฐ๋‚˜ ์ƒ์‡„ํ•˜์—ฌ 
        ‘์ˆœ ๋ฐฐ์ถœ๋Ÿ‰ 0’์„ ๋‹ฌ์„ฑํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.  
        ๋ณธ ์‹œ์Šคํ…œ์€ ๊ธฐ์—…์ด ๋ฐฐ์ถœ๋Ÿ‰์„ ์ •๋Ÿ‰์ ์œผ๋กœ ํŒŒ์•…ํ•˜๊ณ  
        ๊ฐ์ถ• ๊ณ„ํš์„ ์ˆ˜๋ฆฝํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
      </p>
    </section>

    <!-- ์˜จ์‹ค๊ฐ€์Šค ๋ฐฐ์ถœ๋Ÿ‰ ์‚ฐ์ • -->
    <section class="section">
      <h2>์˜จ์‹ค๊ฐ€์Šค ๋ฐฐ์ถœ๋Ÿ‰ ์‚ฐ์ •</h2>
      <p>
        ๋ฐฐ์ถœ๋Ÿ‰ ์‚ฐ์ •์€ ๊ตญ์ œ ๊ธฐ์ค€(GHG Protocol, IPCC ๊ฐ€์ด๋“œ๋ผ์ธ ๋“ฑ)์— ๋”ฐ๋ผ  
        ์Šค์ฝ”ํ”„(Scope 1, 2, 3)๋ณ„ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.  
        ์ž๋™ํ™”๋œ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘๊ณผ ๋ถ„์„์„ ํ†ตํ•ด 
        ํˆฌ๋ช…ํ•˜๊ณ  ์ •ํ™•ํ•œ ์‚ฐ์ • ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
      </p>
    </section>

    <!-- LCA(์ „๊ณผ์ •ํ‰๊ฐ€) -->
    <section class="section">
      <h2>LCA (Life Cycle Assessment)</h2>
      <p>
        LCA๋Š” ์ œํ’ˆ์˜ ์ƒ์‚ฐ๋ถ€ํ„ฐ ํ๊ธฐ๊นŒ์ง€ ์ „ ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•˜๋Š” 
        ํ™˜๊ฒฝ ์˜ํ–ฅ์„ ํ‰๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก ์ž…๋‹ˆ๋‹ค.  
        ํƒ„์†Œ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์€ LCA ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์—ฐ๋™๋˜์–ด  
        ์ œํ’ˆ ๋‹จ์œ„์˜ ํƒ„์†Œ๋ฐœ์ž๊ตญ์„ ์‚ฐ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
      </p>
    </section>

    <!-- ๊ณต์‹œ ๊ธฐ์ค€ -->
    <section class="section">
      <h2>๊ณต์‹œ ๊ธฐ์ค€ ๋ฐ ๋ณด๊ณ </h2>
      <p>
        ESG ๊ณต์‹œ๋Š” ๊ตญ๋‚ด์™ธ ๊ทœ์ œ ๋ฐ ํ‘œ์ค€(GRI, TCFD, ISSB ๋“ฑ)์— ๋”ฐ๋ผ  
        ํƒ„์†Œ ๋ฐฐ์ถœ ๊ด€๋ จ ๋ฐ์ดํ„ฐ๋ฅผ ํˆฌ๋ช…ํ•˜๊ฒŒ ๊ณต๊ฐœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.  
        ๋ณธ ์‹œ์Šคํ…œ์€ ์ž๋™ํ™”๋œ ๋ฆฌํฌํŠธ ์ƒ์„ฑ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์—ฌ  
        ๊ธฐ์—…์ด ์‹ ์†ํ•˜๊ณ  ์ •ํ™•ํ•˜๊ฒŒ ๊ณต์‹œ ์š”๊ฑด์„ ์ถฉ์กฑํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•์Šต๋‹ˆ๋‹ค.
      </p>
    </section>

  </div>

</body>
</html>

 

 

 

์ด๊ฑธ about ํŒŒ์ผ์— ๋„ฃ์œผ๋ฉด

 

์ด๋ ‡๊ฒŒ ๋‚˜์˜ด!!!!!!!!๊บ…!!!! ๋„˜ ๋ง˜์— ๋“ ๋‹น ๊ต์ˆ˜๋‹˜๊ป˜๋„ ์นญ์ฐฌ๋ฐ›์Œ ์บฌ์บฌ!

 

 

 

๋‚˜๋จธ์ง€๋„ ๋‹ค ์ด์–ด์ง€๊ฒŒ๋” ์ฝ”๋“œ ์งœ์„œ ํŒŒ์ผ ๋งŒ๋“ค์–ด์„œ ์—ฐ๊ฒฐ์‹œํ‚ฌ ์˜ˆ์ •

์ด์ œ ์˜ˆ์˜๊ฒŒ ๋‚˜์˜ค๊ฒŒ๋”๋งŒ ๊พธ๋ฏธ๋ฉด ๋ ๋“ฏ!

 


๊ณ„์‚ฐ๊ธฐ ๋„ฃ๊ธฐ! 

 

index์—


    <!-- ํžˆ์–ด๋กœ ์„น์…˜ -->
    <section class="hero" id="index">
        <div class="hero-content">
        <li><a href="/contents/calculator/plus">๋ง์…ˆ </a></li>
        <li><a href="/contents/calculator/minus">๋บ„์…ˆ</a></li>
        <li><a href="/contents/calculator/gob">๊ณฑ์…ˆ</a></li>
        <li><a href="/contents/calculator/nanum">๋‚˜๋ˆ—์…ˆ</a></li>
        </div>
    </section>

 

 

-๋„ฃ๊ธฐ

 

 

 

    @GetMapping("/contents/calculator/plus")
    public String plus() {
        return "contents/calculator/plus"; // Renders templates/auth/login.html
    }

    @GetMapping("/contents/calculator/nanum")
    public String nanum() {
        return "contents/calculator/nanum"; // Renders templates/auth/login.html
    }

    @GetMapping("/contents/calculator/gob")
    public String gob() {
        return "contents/calculator/gob"; // Renders templates/auth/login.html
    }

    @GetMapping("/contents/calculator/minus")
    public String minus() {
        return "contents/calculator/minus"; // Renders templates/auth/login.html
    }
}
 
 
 
 

์—ฐ๊ฒฐ์‹œํ‚ฌ๋•Œ ์Šฌ๋ž˜์‰ฌ ์œ ๋ฌด ๋งค์šฐ ์ค‘์š”!

 

 

๋Ÿฐ ์‹œํ‚ค๋ฉด 

 

 

์งœ๋ผ๋ž€ ์ด๋ ‡๊ฒŒ ๋ฉ๋‹ˆ๋‹ค~~

 

์˜ค๋Š˜์€ ๋