๐Ÿ’ Spring/Spring MVC, DB ์ ‘๊ทผ ๊ธฐ์ˆ 

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

2020. 8. 23. 14:05
๋ชฉ์ฐจ
  1. ํ™˜๊ฒฝ ์„ค์ •
  2. ํšŒ์› ์„œ๋น„์Šค ์Šคํ”„๋ง ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ
๋ฐ˜์‘ํ˜•

์ˆœ์ˆ˜ JDBC

ํ™˜๊ฒฝ ์„ค์ •

build.gradle ํŒŒ์ผ์— jdbc, h2 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ จ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€

implementation 'org.springframework.boot:spring-boot-starter-jdbc'  
runtimeOnly 'com.h2database:h2'  

์Šคํ”„๋ง ๋ถ€ํŠธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์„ค์ • ์ถ”๊ฐ€
resource/application.properties

spring.datasource.url=jdbc:h2:tcp://localhost/~/test  
spring.datasource.driver-class-name=org.h2.Driver  

 

jdbc ๊ด€๋ จ ์ฝ”๋“œ ์ƒ๋žต.. (์ •์‹ ๊ฑด๊ฐ•์„ ์œ„ํ•ด ๋„˜์–ด๊ฐ„๋‹ค)

 

์Šคํ”„๋ง ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ๋งŒ๋“ค๊ธฐ

ํšŒ์› ์„œ๋น„์Šค ์Šคํ”„๋ง ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ

package iseunghan.iseunghanspring.service;

import iseunghan.iseunghanspring.domain.Member;
import iseunghan.iseunghanspring.repository.MemberRepository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.annotation.Transactional;

import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertThrows;


@SpringBootTest
@Transactional //transaction rollBack์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฟผ๋ฆฌ์— ์•ˆ๋‚จ๋Š”๋‹ค.
class MemberServiceIntegrationTest {


    @Autowired MemberRepository memberRepository;
    @Autowired MemberService memberService;


    @Test //test ๋ฉ”์†Œ๋“œ ์ด๋ฆ„์€ ๊ณผ๊ฐํ•˜๊ฒŒ ํ•œ๊ธ€๋กœ ์ ์–ด๋„ ๋œ๋‹ค.
    void ํšŒ์›๊ฐ€์ž…() {
        //given
        Member member = new Member();
        member.setName("spring100");

        //when
        Long saveId = memberService.join(member);

        //then
        Member findMember = memberService.findOne(saveId).get();
        assertThat(member.getName()).isEqualTo(findMember.getName());

    }

    @Test
    public void ์ค‘๋ณต_ํšŒ์›(){
        //given
        Member member1 = new Member();
        member1.setName("spring");

        Member member2 = new Member();
        member2.setName("spring");

        //when
        memberService.join(member1);
        //๊ธฐ๋ณธ ์ œ๊ณตํ•˜๋Š” ๋ฉ”์†Œ๋“œ
        IllegalStateException e = assertThrows(IllegalStateException.class, () -> {
            memberService.join(member2);
        });
        assertThat(e.getMessage()).isEqualTo("์ด๋ฏธ ์กด์žฌํ•˜๋Š” ํšŒ์›์ž…๋‹ˆ๋‹ค.");

        /*
        try {
            memberService.join(member2);
            fail("์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.");
        }catch (IllegalStateException e){
            assertThat(e.getMessage()).isEqualTo("์ด๋ฏธ ์กด์žฌํ•˜๋Š” ํšŒ์›์ž…๋‹ˆ๋‹ค.");
        }
*/


        //then

    }




    @Test
    void findMember() {
    }

    @Test
    void findOne() {
    }
}

์‚ฌ์‹ค์€ ์ด์ „์— ํ–ˆ๋˜ ํ…Œ์ŠคํŠธ๋“ค์€ ์ˆœ์ˆ˜ํ•œ java์ฝ”๋“œ๋“ค๋กœ๋งŒ ํ…Œ์ŠคํŠธํ•œ๊ฒƒ์ด๋ผ JVM์•ˆ์—์„œ ๋๋‚ฌ๋Š”๋ฐ,

@SpringBootTest, @Transactional ์• ๋…ธํ…Œ์ด์…˜์ด ๋ถ™์œผ๋ฉด ์‹ค์ œ ์Šคํ”„๋ง์„ ๋„์›Œ์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์‹œ์ž‘์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

transactional ์• ๋…ธํ…Œ์ด์…˜์€ ๊ฐ ํ…Œ์ŠคํŠธ๊ฐ€ ๋๋‚˜๋ฉด ๋กค๋ฐฑ ์‹œ์ผœ์„œ db์— ๋ฐ์ดํ„ฐ๋“ค์„ ์ดˆ๊ธฐํ™”๋ฅผ ์‹œ์ผœ์ค€๋‹ค.


๊ทธ๋ž˜์„œ ์ด์ „์— ์ž‘์„ฑํ•œ ์ฝ”๋“œ์ค‘์—

@AfterEach
public void afterEach(){
    memberRepository.clearStore();
}  

์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์ง€ ์•Š์•„๋„ , ์• ๋…ธํ…Œ์ด์…˜ ํ•œ์ค„๋งŒ ์žˆ์œผ๋ฉด ๊ฐ„๋‹จํ•˜๊ฒŒ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋‹ค.


@SpringBootTest : ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์™€ ํ…Œ์ŠคํŠธ๋ฅผ ํ•จ๊ป˜ ์‹คํ–‰ํ•œ๋‹ค.
@Transactional : ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์— ์ด ์• ๋…ธํ…Œ์ด์…˜์ด ์žˆ์œผ๋ฉด, ํ…Œ์ŠคํŠธ ์‹œ์ž‘ ์ „์— ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•˜๊ณ , ํ…Œ์Šค ํŠธ ์™„๋ฃŒ ํ›„์— ํ•ญ์ƒ ๋กค๋ฐฑํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด DB์— ๋ฐ์ดํ„ฐ๊ฐ€ ๋‚จ์ง€ ์•Š์œผ๋ฏ€๋กœ ๋‹ค์Œ ํ…Œ์ŠคํŠธ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.

 

 

์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ์˜ฌ๋ฆฌ๊ณ , db ๋ž‘ ๊ฐ™์ด ์˜ฌ๋ ค์„œ ํ•˜๋Š” ํ…Œ์ŠคํŠธ๋Š” ์‚ฌ์‹ค์ƒ ์ข‹์€ ํ…Œ์ŠคํŠธ์˜ ์˜ˆ๋Š” ์•„๋‹ˆ๋‹ค. ์ด๋Ÿฐ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋ผ๊ณ  ํ•˜๋Š”๋ฐ, ์ž‘์€ ๋‹จ์œ„๋กœ ์ชผ๊ฐœ์„œ ํ•˜๋Š” ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๊ฐ€ ๋” ์ข‹์€ ํ…Œ์ŠคํŠธ์ผ ํ™•๋ฅ ์ด ๋†’๋‹ค. ์•ž์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์งค๋•Œ, ์ˆœ์ˆ˜ํ•œ ์ž๋ฐ” ์ฝ”๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ํ•˜๋Š” ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์— ์ข€ ๋” ์ค‘์ ์„ ๋‘๊ณ  ํ•˜๋Š”๊ฒŒ ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

๋ฐ˜์‘ํ˜•
์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)
  1. ํ™˜๊ฒฝ ์„ค์ •
  2. ํšŒ์› ์„œ๋น„์Šค ์Šคํ”„๋ง ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ
'๐Ÿ’ Spring/Spring MVC, DB ์ ‘๊ทผ ๊ธฐ์ˆ ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • h2 database ์„ค์น˜ ๋ฐ ์—ฐ๊ฒฐ
  • ์•„์ฃผ ๊ฐ„๋‹จํ•œ CRUD ๊ฐœ๋ฐœ ์—ฐ์Šต
  • [์›นMVC] ์Šคํ”„๋ง JdbcTemplate
  • ์Šคํ”„๋ง ์›น MVC : API @ResponseBody
iseunghan
iseunghan
๊พธ์ค€ํ•˜๊ฒŒ ์—ด์‹ฌํžˆ..
iseunghan๊พธ์ค€ํ•˜๊ฒŒ ์—ด์‹ฌํžˆ..
iseunghan
iseunghan

๊ณต์ง€์‚ฌํ•ญ

  • ์–ด์ œ๋ณด๋‹ค ๋‚˜์€ ์˜ค๋Š˜์ด ๋˜๊ธฐ ์œ„ํ•ด ๐Ÿ”ฅ
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (261)
    • ๐Ÿ’ Spring (14)
      • ๊ฐœ๋… ๋ฐ ์ดํ•ด (2)
      • Spring ํ•ต์‹ฌ ๊ธฐ์ˆ  (24)
      • Spring REST API (8)
      • Spring MVC, DB ์ ‘๊ทผ ๊ธฐ์ˆ  (7)
      • Spring Security (23)
      • Spring in Action (1)
    • ๐ŸŒป JAVA (84)
      • ์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ (20)
      • ์•Œ๊ณ ๋ฆฌ์ฆ˜, ์ž๋ฃŒ๊ตฌ์กฐ (13)
      • ๋””์ž์ธ ํŒจํ„ด (7)
      • ์ •๋ฆฌ์ •๋ฆฌ์ •๋ฆฌ (43)
      • JUnit (1)
    • ๐Ÿ”– Snippets (3)
      • Javascript (3)
    • โš™๏ธ Devops (22)
      • โ› Git (11)
      • ๐Ÿณ Docker (6)
      • ๐Ÿง Linux (3)
      • ๐ŸŒˆ Jenkins (1)
      • ๐Ÿ“ฌ Kafka (1)
    • ๐Ÿ’ฌ ETC.. (4)
      • ๐Ÿ’ป macOS (2)
    • ๐ŸŒง๏ธ ORM (2)
      • JPA (2)
    • ๐Ÿ Python (2)
    • ๐Ÿ“š Databases (15)
      • ์˜ค๋ผํด๋กœ ๋ฐฐ์šฐ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐœ๋ก ๊ณผ ์‹ค์Šต(2ํŒ) (3)
      • RealMySQL 8.0 (8)
    • ๐Ÿ”ฅ Computer Science (5)
      • ๐Ÿ“ก ๋„คํŠธ์›Œํฌ (5)
    • ๐Ÿท๏ธ ํ˜‘์—… (1)
    • ๐Ÿ“œ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ (38)
      • BAEKJOON\์ˆ˜ํ•™ 1, ์ˆ˜ํ•™ 2 (8)
      • BAEKJOON\์žฌ๊ท€ (5)
      • BAEKJOON\๋ธŒ๋ฃจํŠธ ํฌ์Šค (3)
      • BAEKJOON\์ •๋ ฌ (1)
      • BAEKJOON\๋ฐฑํŠธ๋ž˜ํ‚น (5)
      • BAEKJOON\BFS, DFS (6)
      • BAEKJOON\์ด๋ถ„ํƒ์ƒ‰ (1)
      • BAEKJOON\๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ (9)
      • BAEKJOON\๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜ (0)
    • โœจ ISEUNGHAN (1)

์ธ๊ธฐ ๊ธ€

์ตœ๊ทผ ๊ธ€

์ „์ฒด
์˜ค๋Š˜
์–ด์ œ
๋ฐ˜์‘ํ˜•
hELLO ยท Designed By ์ •์ƒ์šฐ.
iseunghan
[์›นMVC] ์Šคํ”„๋ง ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”

๊ฐœ์ธ์ •๋ณด

  • ํ‹ฐ์Šคํ† ๋ฆฌ ํ™ˆ
  • ํฌ๋Ÿผ
  • ๋กœ๊ทธ์ธ

๋‹จ์ถ•ํ‚ค

๋‚ด ๋ธ”๋กœ๊ทธ

๋‚ด ๋ธ”๋กœ๊ทธ - ๊ด€๋ฆฌ์ž ํ™ˆ ์ „ํ™˜
Q
Q
์ƒˆ ๊ธ€ ์“ฐ๊ธฐ
W
W

๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๊ธ€

๊ธ€ ์ˆ˜์ • (๊ถŒํ•œ ์žˆ๋Š” ๊ฒฝ์šฐ)
E
E
๋Œ“๊ธ€ ์˜์—ญ์œผ๋กœ ์ด๋™
C
C

๋ชจ๋“  ์˜์—ญ

์ด ํŽ˜์ด์ง€์˜ URL ๋ณต์‚ฌ
S
S
๋งจ ์œ„๋กœ ์ด๋™
T
T
ํ‹ฐ์Šคํ† ๋ฆฌ ํ™ˆ ์ด๋™
H
H
๋‹จ์ถ•ํ‚ค ์•ˆ๋‚ด
Shift + /
โ‡ง + /

* ๋‹จ์ถ•ํ‚ค๋Š” ํ•œ๊ธ€/์˜๋ฌธ ๋Œ€์†Œ๋ฌธ์ž๋กœ ์ด์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ํ‹ฐ์Šคํ† ๋ฆฌ ๊ธฐ๋ณธ ๋„๋ฉ”์ธ์—์„œ๋งŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.