๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Spring8

[SpringBoot] HTML form ์ „์†ก vs JavaScript๋กœ JSON ์ „์†ก ๐Ÿงฉ 1. HTML ์ „์†ก ๋ฐฉ์‹๐Ÿ”น ๊ฐœ์š”๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ํผ ์ „์†ก ๊ธฐ๋Šฅ ์‚ฌ์šฉ ํƒœ๊ทธ์˜ action๊ณผ method ์†์„ฑ์„ ์ด์šฉํ•ด ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†ก์ „์†ก ํ˜•์‹์€ ๊ธฐ๋ณธ์ ์œผ๋กœ application/x-www-form-urlencoded ๋˜๋Š” multipart/form-data (ํŒŒ์ผ ์—…๋กœ๋“œ ์‹œ)๐Ÿ”น ์˜ˆ์‹œ ์ฝ”๋“œ ์•„์ด๋””: ๋น„๋ฐ€๋ฒˆํ˜ธ: ํšŒ์›๊ฐ€์ž… ๐Ÿ”น ์„œ๋ฒ„ (Spring Boot Controller)@ReauireArgsConstructor@Controllerpublic class UserController { private final UserService userservice; @PostMapping("/user") public String signup(AddUserReq.. 2025. 11. 2.
[SpringBoot] servlet-context.xml, root-context.xml, pom.xml, web.xml ์ฐจ์ด์  1. root-context.xml์˜ ์—ญํ• root-context.xml์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด์— ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” Bean์„ ์ •์˜ํ•˜๋Š” ์Šคํ”„๋ง ์„ค์ • ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์„œ๋น„์Šค(@Service), ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” DAO/Repository(@Repository), ๊ณตํ†ต์ ์ธ ์œ ํ‹ธ๋ฆฌํ‹ฐ ๋“ฑ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.์˜ˆ์‹œ:์„œ๋น„์Šค ๊ณ„์ธต (@Service)๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๊ณ„์ธต (@Repository)์˜ˆ์™ธ ์ฒ˜๋ฆฌ, ๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ๋“ค (@Component)root-context.xml ์˜ˆ์‹œ : --> 2. servlet-context.xml์˜ ์—ญํ• servlet-context.xml์€ Spring Web MVC ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์›น ๊ด€๋ จ ์„ค์ •์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํŒŒ.. 2025. 1. 12.
[SpringBoot] ์—”ํ‹ฐํ‹ฐ int VS Integer ํƒ€์ž… ์ฐจ์ด int ํƒ€์ž…์€ ๊ธฐ๋ณธํƒ€์ž…์ด๊ณ , Integerํƒ€์ž…์€ ๋ž˜ํผํด๋ž˜์Šค์ด๋‹ค.๋งŒ์•ฝ ๋„๋ฉ”์ธ์— null์ด ๋“ค์–ด์˜จ๋‹ค๋ฉด intํƒ€์ž…์€ ์—๋Ÿฌ์ด๊ณ , Integerํƒ€์ž…์€ null๊ฐ’ ์œผ๋กœ ๋ฐ›์•„๋“ค์ธ๋‹ค.๋”ฐ๋ผ์„œ, ๊ฐ€๊ฒฉ์ด ์—†์„ ๋•Œ null๋กœ ํ•˜๊ณ  ์‹ถ์œผ๋ฉด Integerํƒ€์ž…์œผ๋กœ ์„ ์–ธํ•˜๋ฉด ๋˜๊ณ , @Column private Integer price; //๊ฐ€๊ฒฉ0์œผ๋กœ ํ•˜๊ณ  ์‹ถ์œผ๋ฉด int ํƒ€์ž…์œผ๋กœ ํ•˜๋ฉด ๋œ๋‹ค.๋„๊ฐ’ ํ—ˆ์šฉX์ด๋ฉด int๋กœ ํ•ด์„œ @Column(nullable = false) private int price; //๊ฐ€๊ฒฉ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋œ๋‹ค. 2024. 4. 6.
window.location๊ณผ redirect ์ฐจ์ด 1. ์œˆ๋„์šฐ ๋กœ์ผ€์ด์…˜์„ ํ†ตํ•œ ํŽ˜์ด์ง€ ์ด๋™ (Window Location Redirect): ์žฅ์ : ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ์ฒ˜๋ฆฌ๋˜๋ฏ€๋กœ ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋น ๋ฅด๊ณ  ๊ฐ„ํŽธํ•˜๊ฒŒ ํŽ˜์ด์ง€๋ฅผ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹จ์ : ํŽ˜์ด์ง€ ์ด๋™ ํ›„ ์ƒˆ๋กœ๊ณ ์นจ์„ ํ†ตํ•ด ์ตœ์‹  ๋ฐ์ดํ„ฐ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€์ ์ธ ์ž‘์—…์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ JavaScript๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•œ ๊ฒฝ์šฐ์—๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 2. ์„œ๋ฒ„์—์„œ์˜ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ (Server-side Redirect): ์žฅ์ : ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ ์ ˆํ•œ ์ƒํƒœ ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ํŽ˜์ด์ง€ ์ด๋™์„ ์ง€์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ JavaScript๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ : ํด๋ผ์ด์–ธํŠธ ์ธก์˜ ์ถ”๊ฐ€ ์š”์ฒญ์ด ํ•„์š”ํ•˜๋ฏ€๋กœ ์•ฝ๊ฐ„์˜ ์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„ ์ธก.. 2024. 2. 25.
[SpringBoot] ๊ตฌ๊ธ€ ๋กœ๊ทธ์ธ api ํ…Œ์ŠคํŠธ ์‚ฌ์šฉ์ž ์ถ”๊ฐ€ ๊ตฌ๊ธ€ ๋กœ๊ทธ์ธ ๋งŒ๋“ค๊ณ , ๊ตฌ๊ธ€ ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ ํด๋ฆญ ํ–ˆ๋”๋‹ˆ Google์˜ ์ธ์ฆ ์ ˆ์ฐจ๋ฅผ ์™„๋ฃŒํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์•ฑ์€ ํ˜„์žฌ ํ…Œ์ŠคํŠธ ์ค‘์ด๋ฉฐ ๊ฐœ๋ฐœ์ž๊ฐ€ ์Šน์ธํ•œ ํ…Œ์Šคํ„ฐ๋งŒ ์•ฑ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•ก์„ธ์Šคํ•  ์ž๊ฒฉ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋ฉด ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋ฌธ์˜ํ•˜์„ธ์š”. ๋ผ๋Š” ๋ฌธ๊ตฌ๊ฐ€ ๋‚˜์˜ค๊ธธ๋ž˜ ํ…Œ์ŠคํŠธ ์‚ฌ์šฉ์ž ์„ค์ •ํ•˜๋‚˜๊ฐ€ ๋น ์กŒ๋‹ค. OAuth ๋™์˜ ํ™”๋ฉด -> ํ…Œ์ŠคํŠธ์‚ฌ์šฉ์ž ADD USERS ํด๋ฆญํ•ด์„œ ์ด๋ฉ”์ผ ์ถ”๊ฐ€ 2024. 2. 18.
[SpringBoot] ์Šคํ”„๋ง์—์„œ Bean ์ฃผ์ž… ์‹œ @Autowired ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•˜์ง€ ์•Š๋Š” ์ด์œ  Spring์—์„œ ๊ด€๋ฆฌํ•˜๋Š” Bean ๊ฐ์ฒด ์ฃผ์ž… ๋ฐฉ๋ฒ•์—๋Š” 3๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. (Controller, Service์—์„œ DI ๋ฐœ์ƒ)@Autowiredsetter์ƒ์„ฑ์ž์ด ์ค‘ ๊ฐ€์žฅ ๊ถŒ์žฅํ•˜๋Š” ๋ฐฉ์‹์€ ์ƒ์„ฑ์ž๋กœ ์ฃผ์ž…๋ฐ›๋Š” ๋ฐฉ์‹์ด๋‹ค.(@Autowired๋Š” ๊ถŒ์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.) ์ฆ‰, ์ƒ์„ฑ์ž๋กœ Bean ๊ฐ์ฒด๋ฅผ ๋ฐ›๋„๋กํ•˜๋ฉด @Autowired์™€ ๋™์ผํ•œ ํšจ๊ณผ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ƒ์„ฑ์ž๋Š” @RequiredArgsConstructor์ด final์ด ์„ ์–ธ๋œ ๋ชจ๋“  ํ•„๋“œ๋ฅผ ์ธ์ž๊ฐ’์œผ๋กœ ํ•˜๋Š” ์ƒ์„ฑ์ž๋ฅผ ๋กฌ๋ณต์˜ @RequiredArgsConstructor๊ฐ€ ๋Œ€์‹  ํ•ด์ค€๋‹ค. (์ƒ์„ฑ์ž๋ฅผ ์ง์ ‘ ์•ˆ ์“ฐ๊ณ  ๋กฌ๋ณต ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ํ•ด๋‹น ํด๋ž˜์Šค์˜ ์˜์กด์„ฑ ๊ด€๊ณ„๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์ƒ์„ฑ์ž ์ฝ”๋“œ๋ฅผ ๊ณ„์†ํ•ด์„œ ์ˆ˜์ •ํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค. @RequiredA.. 2024. 2. 15.
[SpringBoot] JUnit ํ…Œ์ŠคํŠธ์—์„œ @Slf4j ์‚ฌ์šฉํ•˜๊ธฐ JUnit ํ…Œ์ŠคํŠธ์—์„œ @Slf4j ์‚ฌ์šฉํ•˜๋ ค๋ฉด build.gradle ํŒŒ์ผ์— ์•„๋ž˜ ๋‚ด์šฉ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค. testAnnotationProcessor 'org.projectlombok:lombok' // ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ์„ธํŒ… @Slf4j testImplementation 'org.projectlombok:lombok' // ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ์„ธํŒ… @Slf4j ๊ทธ๋Ÿฌ๋ฉด ์ •์ƒ์ ์œผ๋กœ ๋กœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.์•„๋ž˜๋Š” @Slf4j ์‚ฌ์šฉํ•œ ์˜ˆ์‹œ๋‹ค.package com.pnow.repository;import com.pnow.domain.Category;import com.pnow.domain.CategoryType;import lombok.extern.slf4j.Slf4j;import org.junit.jupiter.api... 2024. 2. 14.
[SpringBoot] jpa ์—”ํ‹ฐํ‹ฐ 3์ ๋Œ€ jakarta ํŒจํ‚ค์ง€ ์ฃผ์˜์‚ฌํ•ญ jpa ์—”ํ„ฐํ‹ฐ ์„ค์ •ํ•  ๋•Œ ํŒจํ‚ค์ง€๋ฅผ ๋ฒ„์ „๋ณ„๋กœ ๋‹ค๋ฅด๊ฒŒ ์จ์•ผ ํ•œ๋‹ค. ์Šคํ”„๋ง๋ถ€ํŠธ 2.x ๋ฒ„์ „ import javax.* ์Šคํ”„๋ง๋ถ€ํŠธ 3.x ๋ฒ„์ „ import jakarta.* jpa 3.x๋ฒ„์ „ jakarta ํŒจํ‚ค์ง€ ์˜ˆ์‹œ:package com.mysite.sbb;import java.time.LocalDateTime;import jakarta.persistence.Column;import jakarta.persistence.Entity;import jakarta.persistence.GeneratedValue;import jakarta.persistence.GenerationType;import jakarta.persistence.Id;import lombok.Getter;import lombok.Setter;@G.. 2024. 2. 11.