๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๋ฐ˜์‘ํ˜•

Spring Boot21

[error] Unable to determine Dialect without JDBC metadata ํ•ด๊ฒฐ SpringBoot๋ž‘ mariaDB(ํ˜น์€ mySQL) ์—ฐ๋™์ด ์•ˆ๋์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ์ธ๋“ฏ. application.properties๋‚˜ application.yml ํŒŒ์ผ ๊ฐ€์„œ์˜คํƒ€๋‚˜ ๋ญ ๋นผ๋จน์€๊ฑฐ ์—†๋‚˜ ๋ณด์„ธ์š” ์ €์˜ ๊ฒฝ์šฐ๋Š” ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๋“ฑ๋กํ•ด๋†“์€ .env ํŒŒ์ผ ์ธ์‹์ด ์•ˆ๋ผ์„œ ์—๋Ÿฌ๋‚˜ ๊ฐ”์Œ. ๊ทผ๋ฐ ๋งค๋ฒˆ ํ”„๋กœ์ ํŠธ ๊ป๋‹ค ํ‚ฌ๋•Œ๋งˆ๋‹ค edit Configuration๋“ค์–ด๊ฐ€์„œ .envํŒŒ์ผ ๋“ฑ๋กํ•ด์ค˜์•ผ ํ•˜๋Š”๊ฑด๊ฐ€..? ํ  2025. 11. 28.
[JUnit] does not declare any static, non-private, non-final, nested classes annotated with @Configuration ์—๋Ÿฌ ํ•ด๊ฒฐ JUnit ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๋Œ๋ฆฌ๋‹ค๊ฐ€ does not declare any static, non-private, non-final, nested classes annotated with @Configuration.๋ผ๊ณ  ์—๋Ÿฌ๊ฐ€ ๋‚˜์˜ค๋ฉด์„œ ์‹คํ–‰์ด ์•ˆ๋จ @SpringBootTest ์•„๋ž˜์—@ContextConfiguration(classes = SpringBootApplication.class) ๋ถ™์—ฌ์„œ ํ•ด๊ฒฐํ•จ ๊ธฐ์กด์—๋Š” ๋ณ„๋„๋กœ ์–ด๋–ค ์„ค์ • ํด๋ž˜์Šค๋ฅผ ์“ธ์ง€ ๋ช…์‹œ๋ฅผ ์•ˆํ•ด๋†”์„œ ์Šคํ”„๋ง์ด ์ฐพ์œผ๋ ค๊ณ  ์‹œ๋„ํ•˜๋ ค๋‹ค๊ฐ€ ๋ชป์ฐพ์€๊ฑฐ์ž„. ๊ทผ๋ฐ @ContextConfiguration(classes = BlogApplication.class) ๋ผ๊ณ  ์จ์คŒ์œผ๋กœ์จ์ง์ ‘ ๋ช…์‹œ๋กœ ๋ฎ์–ด์ค€๊ฒƒ. 2025. 5. 28.
[OAuth] OAuth2 ์„ค์ • ํŒŒ์ผ ์ž‘์„ฑ OAuth2๋ฅผ ๊ธฐ์กด JWT์™€ ํ•จ๊ป˜ ์“ฐ๋ ค๋ฉด๊ธฐ์กด์— ์ž‘์„ฑํ•ด๋‘” ์„ค์ •์ด ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ์„ค์ •์„ ์จ์•ผํ•จ. 1. ๊ธฐ์กด ํผ ๋กœ๊ทธ์ธ ๋ฐฉ์‹์— ์ป๋˜ WebSecurityConfig.java ํŒŒ์ผ ์ „๋ถ€ ์ฃผ์„์ฒ˜๋ฆฌ~~~~~ 2 . config ํŒจํ‚ค์ง€์— WebOauthSecurityConfig.java ์ƒ์„ฑ@RequiredArgsConstructor@Configurationpublic class WebOAuthSecurityConfig { private final OAuth2UserCustomService oAuth2UserCustomService; private final TokenProvider tokenProvider; private final RefreshTokenService refreshTokenSer.. 2025. 5. 11.
[OAuth2] OAuth2 ์‚ฌ์šฉ์ž ์„œ๋น„์Šค ๊ตฌํ˜„ํ•˜๊ธฐ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์กฐํšŒํ•ด์„œ, ์œ ์ € ํ…Œ์ด๋ธ”์— ์ •๋ณด๊ฐ€ ์žˆ๋Š” ์‚ฌ์šฉ์ž๋ผ๋ฉด๋ฆฌ์†Œ์Šค ์„œ๋ฒ„์—์„œ ์ œ๊ณตํ•ด์ฃผ๋Š” ์ด๋ฆ„์„ ์—…๋Žƒํ•ด์คŒ. ์œ ์ € ํ…Œ์ด๋ธ”์— ์ •๋ณด๊ฐ€ ์—†๋Š” ์‚ฌ์šฉ์ž๋ผ๋ฉด์ƒˆ ์‚ฌ์šฉ์ž๋ฅผ ์ƒ์„ฑํ•ด์„œ DB์— ์ €์žฅ @Table(name = "users")@NoArgsConstructor(access = AccessLevel.PROTECTED)@Getter@Entitypublic class User implements UserDetails { // ์ƒ๋žต // ๋‹‰๋„ค์ž„ ํ•„๋“œ ์ถ”๊ฐ€ @Column(name = "nickname", unique = true) private String nickname; // ๋นŒ๋“œ ํŒจํ„ด์— ๋‹‰๋„ค์ž„ ์ถ”๊ฐ€ @Builder public User(String email, String .. 2025. 5. 11.
[OAuth] OAuth ์˜์กด์„ฑ ์ถ”๊ฐ€, ์ฟ ํ‚ค ๊ด€๋ฆฌ ํด๋ž˜์Šค ๊ตฌํ˜„ํ•˜๊ธฐ ์šฐ์„  ์ง€๋‚œ๋ฒˆ์— ๋ฐ›์•˜๋˜๊ตฌ๊ธ€ ํด๋ผ์ด์–ธํŠธID๋ž‘ ์‹œํฌ๋ฆฟํ‚ค, DB ์„ค์ • ๋น„๋ฒˆ ๋ชจ๋‘.env ํŒŒ์ผ๋กœ ๋นผ๋’€๊ณ  gitignore์— ์„ค์ •๊นŒ์ง€ ํ•ด๋‘ . ์ด์ œ ์ฟ ํ‚ค ๊ด€๋ฆฌ ํด๋ž˜์Šค ๊ตฌํ˜„ํ•˜๊ณ ,OAuth์—์„œ ์ œ๊ณต๋ฐ›์€ ์‚ฌ์šฉ์ž ์ •๋ณด ๊ฐ€์ ธ์˜ค๋Š” ์—ญํ•  ํ•˜๋Š” ์„œ๋น„์Šค ๋งŒ๋“ค๊ฒ ใ…‡ใ… build.gradle์— oauth2-client ์˜์กด์„ฑ ์ถ”๊ฐ€ implementation 'org.springframework.boot:spring-boot-starter-oauth2-client' ์ฟ ํ‚ค ๊ด€๋ฆฌ ํด๋ž˜์Šค ๊ตฌํ˜„ํ•˜๊ธฐ public class CookieUtil { // ์š”์ฒญ๊ฐ’(์ด๋ฆ„, ๊ฐ’, ๋งŒ๋ฃŒ ๊ธฐ๊ฐ„)์„ ๋ฐ”ํƒ•์œผ๋กœ ์ฟ ํ‚ค ์ถ”๊ฐ€ํ•˜๋Š” ๋ฉ”์„œ๋“œ public static void addCookie(HttpServletResponse response, Stri.. 2025. 5. 8.
[OAuth] ๊ตฌ๊ธ€ ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ1 ( ํ† ํฐ ๋ฐœ๊ธ‰๋ฐ›๊ธฐ) ๊ตฌ๊ธ€ ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ ํ•˜๋ ค๋ฉด, ์ธ์ฆ์„œ๋ฒ„์—๊ฒŒ ํ† ํฐ ์ œ๊ณต ๋ฐ›์•„์•ผ๋จ. 1. ๊ตฌ๊ธ€ ํด๋ผ์šฐ๋“œ ์ฝ˜์†” ๋“ค์–ด๊ฐ€์„œhttps://cloud.google.com/cloud-console https://cloud.google.com/cloud-console cloud.google.com [์ฝ˜์†”] ๋ฒ„ํŠผ ํด๋ฆญ. (์ตœ์ดˆ๋ฉด ์‚ฌ์šฉ ๋™์˜ ํ™”๋ฉด ๋œฐ๊ฑฐ์ž„. ๋™์˜ํ•˜๊ณ  ์ ˆ์ฐจ ๋งˆ์น˜๋ฉด ๋จ) 2. ์™ผ์ชฝ ์œ„์˜ [ํ”„๋กœ์ ํŠธ ์„ ํƒ] ํด๋ฆญ, 2-1. [์ƒˆ ํ”„๋กœ์ ํŠธ] ๋ฒ„ํŠผ ํด๋ฆญ 3. ํ”„๋กœ์ ํŠธ ์ด๋ฆ„, ์กฐ์ง ์•Œ์•„์„œ ์ž˜ ์„ค์ •ํ•˜๊ณ [๋งŒ๋“ค๊ธฐ] ๋ฒ„ํŠผ ํด๋ฆญ 4. ์˜ค๋ฅธ์ชฝ ์œ„ ์•Œ๋ฆผ(์ข…๋ชจ์–‘)์— ๋ณด๋ฉด ํ”„๋กœ์ ํŠธ๊ฐ€ ๋ณด์ž„๊ทธ๊ฑฐ ํด๋ฆญ 5. [API ๋ฐ ์„œ๋น„์Šค] - [์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด] ํด๋ฆญ 6. ์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ์˜ [๋™์˜ ํ™”๋ฉด ๊ตฌ์„ฑ] ํด๋ฆญ 7. ์ฑ…์—์„œ๋Š” User Ty.. 2025. 5. 7.
[Spring Boot] ์ฟ ํ‚ค๋ž€? Cookie ๐Ÿช ์ฟ ํ‚ค๋ž€? ์ฟ ํ‚ค๋Š”, ์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋–ค ์‚ฌ์ดํŠธ ๋ฐฉ๋ฌธ ํ–ˆ์„ ๋•Œ,ํ•ด๋‹น ์‚ฌ์ดํŠธ ์„œ๋ฒ„์—์„œ ๋‚ด ๋กœ์ปฌ ํ™˜๊ฒฝ์— ์ €์žฅํ•˜๋Š” ์ž‘์€ ๋ฐ์ดํ„ฐ์ž„.ํด๋ผ์ด์–ธํŠธ(๋ธŒ๋ผ์šฐ์ €)์— ์ €์žฅ๋จ. ์ด ์ฟ ํ‚ค ๋•๋ถ„์—, ์˜ˆ์ „์— ๋ฐฉ๋ฌธํ•œ ์  ์žˆ๋Š”์ง€ ์—†๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๊ณ ์ด์ „์— ๋กœ๊ทธ์ธํ–ˆ๋˜ ์ด๋ ฅ์ด ์žˆ์œผ๋ฉด ๋กœ๊ทธ์ธ ์ •๋ณด๋„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋Š”๊ฑฐ์ž„. ์ฟ ํ‚ค๋Š” ํ‚ค-๊ฐ’ ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Œ.๋งŒ๋ฃŒ๊ธฐ๊ฐ„, ๋„๋ฉ”์ธ ๋“ฑ ์ •๋ณด ๊ฐ–๊ณ  ์žˆ์ŒexsessionIdaccess_token(JWT ์—‘์„ธ์Šค ํ† ํฐ)theme = darkcartId = xyz123์ด๋Ÿฐ์• ๋“ค... ์‹ค์ œ๋กœ๋Š” HTTP ์š”์ฒญ ํ—ค๋”์— ํฌํ•จ๋˜์–ด ์„œ๋ฒ„๋กœ ๊ฐ. HTTP ์š”์ฒญ ํ†ตํ•ด์„œ ์ฟ ํ‚ค์˜ ํŠน์ • ํ‚ค์— ๊ฐ’ ์ถ”๊ฐ€ ๊ฐ€๋Šฅ. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„๋กœ ์ •๋ณด ์š”์ฒญํ•˜๋ฉด,์„œ๋ฒ„์—์„œ ๊ทธ ์ •๋ณด๋ฅผ ๊ฐ’์œผ๋กœ ๋„ฃ์€ ์ฟ ํ‚ค๋ฅผ ๋งŒ๋“ฆ.๊ทธ๋Ÿฌ๊ณ  HTTP ํ—ค๋”์™€ ํ•จ๊ป˜ ๋Œ๋ ค๋ณด๋ƒ„.(Set-Coo.. 2025. 5. 7.
[OAuth] OAuth๋ž€? ํ๋ฆ„, ์šฉ์–ด ์ •๋ฆฌ OAuth๊ฐ€ ๋ญ˜๊นŒ?OAuth๋Š” ์ œ 3์˜ ์„œ๋น„์Šค์— ๊ณ„์ • ๊ด€๋ฆฌ๋ฅผ ๋งก๊ธฐ๋Š” ๋ฐฉ์‹์ž„.ex) ์นด์นด์˜ค๋กœ ๋กœ๊ทธ์ธํ•˜๊ธฐ, ๋„ค์ด๋ฒ„๋กœ ๋กœ๊ทธ์ธํ•˜๊ธฐ ๋“ฑ๋“ฑ.. OAuth ์šฉ์–ด ์ •๋ฆฌ๋จผ์ € ํ•˜๊ฒ ์Œ. ๋ฆฌ์†Œ์Šค ์˜ค๋„ˆ(resource owner)์ธ์ฆ ์„œ๋ฒ„์— ์ž์‹ ์˜ ์ •๋ณด์‚ฌ์šฉ์„ ํ—ˆ๊ฐ€ํ•˜๋Š” ์ฃผ์ฒด.์„œ๋น„์Šค ์ด์šฉํ•˜๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋ฆฌ์†Œ์Šค ์˜ค๋„ˆ์ž„. ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„(resource server)๋ฆฌ์†Œ์Šค ์˜ค๋„ˆ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ , ์˜ค๋„ˆ์˜ ์ •๋ณด๋ฅผ ๋ณดํ˜ธํ•˜๋Š” ์ฃผ์ฒด.๋„ค์ด๋ฒ„, ์นด์นด์˜ค, ๊ตฌ๊ธ€์ด ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„์ž„. ์ธ์ฆ ์„œ๋ฒ„(Authorization server)ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ฆฌ์†Œ์Šค ์˜ค๋„ˆ์˜ ์ •๋ณด์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ† ํฐ ๋ฐœ๊ธ‰ํ•˜๋Š” ์—ญํ• ์„ ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(์‹ค์ œ ์šด์˜์—์„œ๋Š” ์นด์นด์˜ค๊ฐ™์€ ๊ธฐ๊ด€์ด ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„, ์ธ์ฆ์„œ๋ฒ„ ์—ญํ•  ๋™์‹œ์— ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Œ) ํด๋ผ์ด์–ธํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(Client Applica.. 2025. 5. 7.
[Spring Boot] ํƒ€์ž„๋ฆฌํ”„ ์˜ˆ์ œ, Model ๊ฐ์ฒด๋ž€? @Controllerpublic class ExampleController { @GetMapping("/thymeleaf/example") public String thymeleafExample(Model model) { Person examplePerson = new Person(); examplePerson.setId(1L); examplePerson.setName("ํ™๊ธธ๋™"); examplePerson.setAge(18); examplePerson.setHobbies(List.of("์šด๋™", "๋…์„œ")); model.addAttribute("person", examplePerson); model.add.. 2025. 5. 3.
๋ฐ˜์‘ํ˜•