MapleStory Cookie With Halo

๐Ÿƒ Spring 49

[SpringBoot][Gradle][JPA]์ž…๋ฌธ. ์„ค์ •๋ถ€ํ„ฐ ์‚ฌ์šฉ๊นŒ์ง€.

JPAJava Persistence API  ๊ธฐ์กด์˜ ๋ฐ˜๋ณต ์ฝ”๋“œ๋ฟ ์•„๋‹ˆ๋ผ SQL ์ฟผ๋ฆฌ๊นŒ์ง€ JPA๊ฐ€ ์ง์ ‘ ๋งŒ๋“ค์–ด ์‹คํ–‰ํ•ด์ค€๋‹ค.SQL๊ณผ ๋ฐ์ดํ„ฐ ์ค‘์‹ฌ์˜ ์„ค๊ณ„ โ†’ ๊ฐ์ฒด ์ค‘์‹ฌ์˜ ์„ค๊ณ„๋กœ ํŒจ๋Ÿฌ๋‹ค์ž„์„ ์ „ํ™˜.ORM Object Relational Mappping. ๊ฐ์ฒด์™€ ๋งคํ•‘ํ•˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค.๊น€์˜ํ•œ ๊ฐ•์‚ฌ๋‹˜๊ป˜์„œ JPA ์ฑ…์„ ๋ฐœ๊ฐ„ํ•œ ์ดํ›„๋กœ ์šฐ๋ฆฌ ๋‚˜๋ผ์—๋„ ๋ณด๊ธ‰์ด ๋งŽ์ด ๋œ ์ถ”์„ธ๋‹ค.  ํ™˜๊ฒฝ์„ค์ • build.gradle implementation 'org.springframework.boot:spring-boot-starter-data-jpa'  ์ถ”๊ฐ€.jdbc ์‚ญ์ œ.์ถ”๊ฐ€ํ•˜๋ฉด gradle์— jpa์™€ hibernate๊ฐ€ ์ถ”๊ฐ€๋œ ๊ฒŒ ํ™•์ธ๋œ๋‹ค.๐ŸŒŸ jpa๋Š” ์ธํ„ฐํŽ˜์ด์Šค๊ณ  hibernate๋Š” ๊ตฌํ˜„ ํด๋ž˜์Šค ์ด๋‹ค.application.properties..

[SpringBoot]DB์ ‘๊ทผ๊ธฐ์ˆ -JdbcTemplate

์Šคํ”„๋ง JdbcTemplate ์ˆœ์ˆ˜ Jdbc์™€ ๋™์ผํ•œ ํ™˜๊ฒฝ์„ค์ •์„ ํ•˜๋ฉด ๋œ๋‹ค.2025.01.08 - [๐Ÿƒ Spring/๐Ÿƒ Spring Boot] - [SpringBoot]DB์ ‘๊ทผ๊ธฐ์ˆ -์ˆœ์ˆ˜JDBC MyBatis์™€ ๋น„์Šทํ•˜๊ฒŒ ๋ฐ˜๋ณต ์ฝ”๋“œ๋ฅผ ๋Œ€๋ถ€๋ถ„ ์ œ๊ฑฐํ•ด์ค€๋‹ค.SQL์€ ์ง์ ‘ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.  ์‚ฌ์šฉ๋ฒ• src-main-java-hello-hellospringํŒจํ‚ค์ง€ ์•ˆ์— JdbcTemplateMemberRepositoryํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ ๋‹ค.JdcbTemplate ์ƒ์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ . ์•„๋ž˜์ฒ˜๋Ÿผ ์˜์กด์„ฑ ์ƒ์„ฑ์ž (DI) ๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ ๋‹ค.ResultSet์„ ๋ฐ˜ํ™˜ํ•˜๋Š” RowMapper๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ ๋‹ค.ResultSet๊ณผ int rowNum์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์•„ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ ๋‹ค.VScode๊ธฐ์ค€ ๋‹จ์ถ•ํ‚ค Ctrl ..

[SpringBoot]์Šคํ”„๋ง ํ†ตํ•ฉํ…Œ์ŠคํŠธ

DB์™€ ์—ฐ๊ฒฐ๋œ ์Šคํ”„๋ง ํ†ตํ•ฉํ…Œ์ŠคํŠธ MemberServiceTest๋ฅผ ๋ณต์‚ฌํ•ด ์ด๋ฆ„์„ MemberServiceIntergrationTest๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค.DI์„ค์ •์„ ๋ฐ”๊ฟ”์ค€๋‹ค.์ฝ”๋“œ๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ๋น ๊ฟ”์ค€๋‹ค.@AfterEach์˜ memberRepository.clearStore();โ†’ DB๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ง€์›Œ์ค„ ํ•„์š”๊ฐ€ ์—†์–ด ์‚ญ์ œ.@BeforeEach ๋ฉ”์„œ๋“œ ๋ถ€๋ถ„โ†’ ํ…Œ์ŠคํŠธ๋Š” ๊ตณ์ด DI์ƒ์„ฑ์ž๋กœ ํ•  ํ•„์š” ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ”๋€ DIํ•„๋“œ์ฃผ์ž…์œผ๋กœ ์ถฉ๋ถ„ํ•˜๋‹ค.์–ด๋…ธํ…Œ์ด์…˜@SpringBootTestํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์™€ ํ…Œ์ŠคํŠธ๋ฅผ ํ•จ๊ป˜ ์‹คํ–‰ํ•œ๋‹ค.@Transactionalํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ํŠธ๋žœ์žญ์…˜์„ ์‹คํ–‰ํ•œ๋‹ค.๊ทธ๋ฆฌ๊ณ  ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ๋„ฃ์€ ํ›„ํ…Œ์ŠคํŠธ๊ฐ€ ๋๋‚  ๋•Œ๋งˆ๋‹ค rollback์„ ํ•ด์ค€๋‹ค.๋”ฐ๋ผ์„œ ํ…Œ์ŠคํŠธ ๋„์ค‘ DB..

[SpringBoot][Gradle]DB์ ‘๊ทผ๊ธฐ์ˆ -์ˆœ์ˆ˜JDBC

๊ฐ•์˜์— ์‚ฌ์šฉ๋œ H2 Database ์„ค์น˜์™€ ์‚ฌ์šฉ๋ฒ•์€ ํฌ์ŠคํŠธ๋ฅผ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”.2025.01.08 - [๐Ÿ’พ Data Base] - H2 Databas ์„ค์น˜๋ถ€ํ„ฐ ์‚ฌ์šฉ๊นŒ์ง€  ํ™˜๊ฒฝ์„ค์ • build.gradle ํŒŒ์ผ์— jdbc, h2 Database ๊ด€๋ จ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€.implementation 'org.springframework.boot:spring-boot-starter-jdbc'โ†’ java๋Š” DB๋ž‘ ์—ฐ๊ฒฐํ•˜๋ ค๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ  jdbc๊ฐ€ ํ•„์š”ํ•˜๋‹ค.runtimeOnly 'com.h2database:h2'โ†’ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์ œ๊ณตํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ.testImplementation('org.springframework.boot:spring-boot-starter-test') {    exclude group: 'org.ju..

[SpringBoot][Thymeleaf]ํšŒ์›๊ด€๋ฆฌ-์›น MVC๊ฐœ๋ฐœ

MemberController ์ฝ”๋“œ๋”๋ณด๊ธฐpackage hello.hellospring.controller;import java.util.List;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PostMapping;import hello.hellospring.domain.Member;import hello.h..

[SpringBoot]์Šคํ”„๋ง ๋นˆ ๋“ฑ๋ก:2.์ž๋ฐ”์ฝ”๋“œ

โ€ป ์ด์ „ ํŽธ : 2025.01.06 - [๐Ÿƒ Spring/๐Ÿƒ Spring Boot] - [SpringBoot]์Šคํ”„๋ง ๋นˆ ๋“ฑ๋ก:1.์ปดํฌ๋„ŒํŠธ ์Šค์บ”๊ณผ ์ž๋™ ์˜์กด๊ด€๊ณ„ ์„ค์ •  ์ž๋ฐ”์ฝ”๋“œ๋ฅผ ์ ์–ด ์Šคํ”„๋ง ๋นˆ์„ ๋“ฑ๋กํ•ด๋ณด์ž. ์„œ๋น„์Šค์™€ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์˜ @Service @Repository @Autowired ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ชจ๋‘ ์ง€์›Œ์ค€๋‹ค.main์— SpringConfigํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ ๋‹ค.SpringConfig ์ฝ”๋“œ@Configuration ์–ด๋…ธํ…Œ์ด์…˜์„ ํด๋ž˜์Šค ์œ„์— ์ ๋Š”๋‹ค.@Bean ์–ด๋…ธํ…Œ์ด์…˜์„ ์„œ๋น„์Šค์™€ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋ฉ”์„œ๋“œ์— ์ ์–ด์ค€๋‹ค.์ปจํŠธ๋กค๋Ÿฌ๋Š” ๊ทธ๋Œ€๋กœ ์–ด๋…ธํ…Œ์ด์…˜ @Controller์™€ @Autowired๊ฐ€ ํ•„์š”ํ•˜๋‹ค. config ์ „์ฒด์ฝ”๋“œ๋”๋ณด๊ธฐpackage hello.hellospring;import org.springframewor..

[SpringBoot]์Šคํ”„๋ง ๋นˆ ๋“ฑ๋ก:1.์ปดํฌ๋„ŒํŠธ ์Šค์บ”๊ณผ ์ž๋™ ์˜์กด๊ด€๊ณ„ ์„ค์ •

Spring Cotainer ๐Ÿญ  ์Šคํ”„๋ง์ด ์‹œ์ž‘๋  ๋•Œ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ๐Ÿญ ๋ผ๋Š” ํ†ต์ด ์ƒ๊ธด๋‹ค. ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ํด๋ž˜์Šค๋ฅผ ๋“ฑ๋กํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์ด ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๊ฒŒ ์Šคํ”„๋ง ๋นˆ๐Ÿฅ” ์ด๋‹ค.๐Ÿ’ก ์Šคํ”„๋ง ๋นˆ์„ ๋“ฑ๋กํ•˜๋Š” ๋‘๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ปดํฌ๋„ŒํŠธ ์Šค์บ”๊ณผ ์ž๋™ ์˜์กด๊ด€๊ณ„ ์„ค์ •.์ž๋ฐ” ์ฝ”๋“œ๋กœ ์ง์ ‘ ์Šคํ”„๋ง ๋“ฑ๋กํ•˜๊ธฐ.๋จผ์ € 1๋ฒˆ ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์ž.   @Component   ์ด๋•Œ @Controller @ Service @Repository ๊ฐ€ ๋ถ™์€ ํด๋ž˜์Šค ๊ฐ์ฒด๋ฅผ ์Šคํ”„๋ง์— ๋‹ด์•„ ๊ด€๋ฆฌํ•œ๋‹ค.์ด๊ฒƒ์„ ์Šคํ”„๋ง ๋นˆ์ด ๊ด€๋ฆฌํ•œ๋‹ค ๊ณ  ํ•œ๋‹ค.์‚ฌ์‹ค ์ด ์–ด๋…ธํ…Œ์ดํ…Œ์ด์…˜๋“ค์€ ์ปดํฌ๋„ŒํŠธ @Component ๋ฅผ ์ด์šฉํ•ด ๋งŒ๋“ค์–ด์กŒ๋‹ค. ์Šคํ”„๋ง์ด ์ด ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๊ฐ์ฒด๋กœ ํ•˜๋‚˜์”ฉ ๋งŒ๋“ค์–ด ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ๋“ฑ๋กํ•œ๋‹ค.์ปดํฌ๋„ŒํŠธ ์Šค์บ”์ด ์™„๋ฃŒ๋˜์—ˆ๋‹ค.  @Autowired: Controll..

[SpringBoot][JUnit]ํšŒ์›๊ด€๋ฆฌ-์„œ๋น„์Šค์™€ ํ…Œ์ŠคํŠธ

์ด์ „ ํŽธ : 2025.01.04 - [๐Ÿƒ Spring/๐Ÿƒ Spring Boot] - [SpringBoot]ํšŒ์›๊ด€๋ฆฌ-๋„๋ฉ”์ธ๊ณผ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๊ทธ๋ฆฌ๊ณ  ํ…Œ์ŠคํŠธ  @Service ํด๋” src-main-java-hello-hellspring์—์„œ serviceํŒจํ‚ค์ง€์˜ MemberService ํด๋ž˜์Šค.ํด๋ž˜์Šค ์œ„์— @Service๋ฅผ ์ ์–ด์ค€๋‹ค.์„œ๋น„์Šค ์ฝ”๋”ฉ์ฝ”๋“œ์ „์ฒด์ฝ”๋“œ๋”๋ณด๊ธฐpackage hello.hellospring.service;import java.util.List;import java.util.Optional;import org.springframework.stereotype.Service;import hello.hellospring.domain.Member;import hello.hellospring.reposito..

[SpringBoot][JUnit]ํšŒ์›๊ด€๋ฆฌ-๋„๋ฉ”์ธ๊ณผ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๊ทธ๋ฆฌ๊ณ  ํ…Œ์ŠคํŠธ

Domain & @Repository @Repository ๋ฅผ ๋ ˆํฌ์ง€ํ† ๋ฆฌ ํด๋ž˜์Šค ์œ„์— ๋ถ™์—ฌ์ค๋‹ˆ๋‹ค.private static Map store : save()์‹œ ์ €์žฅํ•  ๋ฐ์ดํ„ฐ์šฉ์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.private static long sequence : 0, 1, 2...์‹์œผ๋กœ ์นด์šดํŠธ๋ฅผ ์„ธ๋Š” ์‹œํ€€์Šค ๊ทธ ์ž์ฒด.save() : ๋ฉค๋ฒ„ ์ €์žฅ์šฉ.findId() : id๋กœ ๋ฉค๋ฒ„๊ฐ€ ์žˆ๋Š” ์ง€ ํ™•์ธํ•˜๋Š”๋ฐ, null์ด๋ฉด Optional์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.findByName()store.values().stream() : store ๋งต์˜ ๊ฐ’๋“ค๋งŒ ๋ถˆ๋Ÿฌ์™€ Stream์„ ๋งŒ๋“  ๋’ค.filter(member -> member.getName().equals(name)) : ์ผ์น˜ํ•˜๋Š” ์ด๋ฆ„์ด ์ผ์น˜ํ•˜๋Š” ๊ฒƒ๋“ค์„ ์ฐพ์Šต๋‹ˆ๋‹ค..findAny(); : ์ผ์น˜ํ•˜๋Š” ..

[SpringBoot]ํšŒ์›๊ด€๋ฆฌ-๋น„์ง€๋‹ˆ์Šค ์š”๊ตฌ์‚ฌํ•ญ ์ •๋ฆฌ

๋น„์ง€๋‹ˆ์Šค ์š”๊ตฌ์‚ฌํ•ญ ์ •๋ฆฌ ๋ฐ์ดํ„ฐ : ํšŒ์›ID, ์ด๋ฆ„๊ธฐ๋Šฅ : ํšŒ์› ๋“ฑ๋ก, ์กฐํšŒ์•„์ง ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ๊ฐ€ ์„ ์ •๋˜์ง€ ์•Š์Œ(๊ฐ€์ƒ์˜ ์‹œ๋‚˜๋ฆฌ์˜ค)โ†’ ์ €์žฅ์†Œ๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— Repository๋ฅผ interface๋กœ ๋งŒ๋“ค์–ด ์ง„ํ•ธํ•œ๋‹ค.  ์ผ๋ฐ˜์ ์ธ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ณ„์ธต ๊ตฌ์กฐ  ์ปจํŠธ๋กค๋Ÿฌ์›น MVC์˜ ์ปจํŠธ๋กค๋Ÿฌ ์—ญํ• .java๋‹จ์˜ ์ง„์ž…๋‹จ๊ณ„.์„œ๋น„์Šคํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๊ตฌํ˜„.ex) ์ค‘๋ณต๊ฐ€์ž… ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค๋“ ์ง€.๋ฆฌํฌ์ง€ํ† ๋ฆฌDB์— ์ ‘๊ทผ.๋„๋ฉ”์ธ ๊ฐ์ฒด๋ฅผ DB์— ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌ.๋„๋ฉ”์ธ๋น„์ง€๋‹ˆ์Šค ๋„๋ฉ”์ธ ๊ฐ์ฒด.โ€ป DTO๋ž‘ ๋น„์Šทํ•˜์ง€๋งŒ ๋„๋ฉ”์ธ์€ ๋น„์ง€๋‹ˆ์Šค ๋กœ์ง์„ ๊ฐ€์ง„๋‹ค๋Š” ์ ์ด ๋‹ค๋ฅด๋‹ค.ex) ํšŒ์›, ์ฃผ๋ฌธ, ์ฟ ํฐ ๋“ฑ์„ DB์— ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌ.โ€ป ์ฐธ์กฐ : https://www.inflearn.com/roadmaps/373

๋ฐ˜์‘ํ˜•