๐ H2 ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค์น
์ด๋ฒ์ฃผ๋ ๊ณต๋ถ๋ฅผ ํ๊ธฐ์ ์ ๋จผ์ DB๋ฅผ ์ค์น ํด๋ณด๊ฒ ์ต๋๋ค
์ค์น๋ ๊ฐ๋จํ๊ฒ ํด๋ฆฌ์ด ํด์คฌ์ต๋๋ค!!
๐ ์์ Jdbc
์ด์ ๋ฌด์จ ์ด๊ฒ์ ๊ฒ ์ค์ ์ ํ๋๋ฐ ์ข ์ด๋ ค์์ ๋ค์ผ๋ฉด์ ์ ๋ฆฌ ํด๋ณผ๊ฒ์
@Override
public Member save(Member member) {
String sql = "insert into member(name) values(?)";
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = getConnection();
pstmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
pstmt.setString(1, member.getName());
pstmt.executeUpdate();
rs = pstmt.getGeneratedKeys();
if (rs.next()) {
member.setId(rs.getLong(1));
} else {
throw new SQLException("id ์กฐํ ์คํจ");
}
return member;
} catch (Exception e) {
throw new IllegalStateException(e);
} finally {
close(conn, pstmt, rs);
}
}
- rs : ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์
- members์์ id๋ ์ด๋ฆ์ ๋ฐ์์ด
- ๊ฐ๋ฐฉ-ํ์ ์์น(OCP, Open-Closed Principle)
- ํ์ฅ์๋ ์ด๋ ค์๊ณ , ์์ , ๋ณ๊ฒฝ์๋ ๋ซํ์๋ค.
- ์คํ๋ง์ DI (Dependencies Injection)์ ์ฌ์ฉํ๋ฉด ๊ธฐ์กด ์ฝ๋๋ฅผ ์ ํ ์๋์ง ์๊ณ , ์ค์ ๋ง์ผ๋ก ๊ตฌํ ํด
๋์ค๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค.
๐ ์คํ๋ง ํตํฉ ํ ์คํธ
@SpringBootTest
@Transactional
class MemberServiceIntegrationTest {
@Autowired MemberService memberService;
@Autowired MemberRepository memberRepository;
@Test
public void ํ์๊ฐ์
() throws Exception {
//Given
Member member = new Member();
member.setName("hello");
//When
Long saveId = memberService.join(member);
//Then
Member findMember = memberRepository.findById(saveId).get();
assertEquals(member.getName(), findMember.getName());
}
@Test
public void ์ค๋ณต_ํ์_์์ธ() throws Exception {
//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("์ด๋ฏธ ์กด์ฌํ๋ ํ์์
๋๋ค.");
}
}
@SpringBootTest` : ์คํ๋ง ์ปจํ ์ด๋์ ํ ์คํธ๋ฅผ ํจ๊ป ์คํํ๋ค.
@Transactional` : ํ ์คํธ ์ผ์ด์ค์ ์ด ์ ๋ ธํ ์ด์ ์ด ์์ผ๋ฉด, ํ ์คํธ ์์ ์ ์ ํธ๋์ญ์ ์ ์์ํ๊ณ , ํ
์คํธ ์๋ฃ ํ์ ํญ์ ๋กค๋ฐฑํ๋ค. ์ด๋ ๊ฒ ํ๋ฉด DB์ ๋ฐ์ดํฐ๊ฐ ๋จ์ง ์์ผ๋ฏ๋ก ๋ค์ ํ ์คํธ์ ์ํฅ์ ์ฃผ์ง ์๋๋ค.
๐ ์คํ๋ง JdbcTemplate
- ์์ Jdbc์ ๋์ผํ ํ๊ฒฝ์ค์ ์ ํ๋ฉด ๋๋ค.
- ์คํ๋ง JdbcTemplate๊ณผ MyBatis ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ JDBC API์์ ๋ณธ ๋ฐ๋ณต ์ฝ๋๋ฅผ ๋๋ถ๋ถ ์ ๊ฑฐํด์ค
๋ค. ํ์ง๋ง SQL์ ์ง์ ์์ฑํด์ผ ํ๋ค.
์.... ์ข ์ด๋ ค์์ ๋ญ์ง ์ ๊ฐ์ด ์์ต๋๋ค..
@Override
public Optional<Member> findById(Long id) {
List<Member> result = jdbcTemplate.query("select * from member where id
= ?", memberRowMapper(), id);
return result.stream().findAny();
}
@Override
public List<Member> findAll() {
return jdbcTemplate.query("select * from member", memberRowMapper());
}
@Override
public Optional<Member> findByName(String name) {
List<Member> result = jdbcTemplate.query("select * from member where
name = ?", memberRowMapper(), name);
return result.stream().findAny();
}
private RowMapper<Member> memberRowMapper() {
return (rs, rowNum) -> {
Member member = new Member();
member.setId(rs.getLong("id"));
member.setName(rs.getString("name"));
return member;
};
}
}
์ด๋ฐ ์ฝ๋๋ฅผ ์ฌ์ฉํด์ ์ธํ ์ ํด์ฃผ๊ธด ํ์ด์
๐ JPA
- JPA๋ ๊ธฐ์กด์ ๋ฐ๋ณต ์ฝ๋๋ ๋ฌผ๋ก ์ด๊ณ , ๊ธฐ๋ณธ์ ์ธ SQL๋ JPA๊ฐ ์ง์ ๋ง๋ค์ด์ ์คํํด์ค๋ค.
- JPA๋ฅผ ์ฌ์ฉํ๋ฉด, SQL๊ณผ ๋ฐ์ดํฐ ์ค์ฌ์ ์ค๊ณ์์ ๊ฐ์ฒด ์ค์ฌ์ ์ค๊ณ๋ก ํจ๋ฌ๋ค์์ ์ ํ์ ํ ์ ์๋ค.
- JPA๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๋ฐ ์์ฐ์ฑ์ ํฌ๊ฒ ๋์ผ ์ ์๋ค.
๊ฐ์๋ฅผ ๋ฃ๋๋ฐ ๋ด์ฉ์ด ๋๋ฌด ์ด๋ ค์์...
jpa?
- Java ์ง์์์ ORM(Object-Relational Mapping) ๊ธฐ์ ํ์ค์ผ๋ก ์ฌ์ฉํ๋ ์ธํฐํ์ด์ค ๋ชจ์
- ์๋ฐ ์ดํ๋ฆฌ์ผ์ด์ ์์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์์ ์ ์ํ ์ธํฐํ์ด์ค
- ์ธํฐํ์ด์ค ์ด๊ธฐ ๋๋ฌธ์ Hibernate, OpenJPA ๋ฑ์ด JPA๋ฅผ ๊ตฌํํจ
๋ด์ฉ์ด ๋๋ฌด ์ด๋ ค์์.....
package hello.hello_spring.domain;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class Member {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
์ด๊ฑฐ๋ Memeber ํด๋์ค ์ฝ๋์ธ๋ฐ ๋ญ๊ฐ ๊ฐ์ด ์ ์์์
๐ ์คํ๋ง JPA
- ๊ฐ๋ฐ ์์ฐ์ฑ ์ฆ๊ฐ
- ์ฝ๋ ์ค์ด๋ฌ
**์คํ๋ง ๋ฐ์ดํฐ JPA ์ ๊ณต ๊ธฐ๋ฅ**
- ์ธํฐํ์ด์ค๋ฅผ ํตํ ๊ธฐ๋ณธ์ ์ธ CRUD
- findByName(), findByEmail() ์ฒ๋ผ ๋ฉ์๋ ์ด๋ฆ ๋ง์ผ๋ก ์กฐํ ๊ธฐ๋ฅ ์ ๊ณต
- ํ์ด์ง ๊ธฐ๋ฅ ์๋ ์ ๊ณต
๊ฐ์ธ์ ์ผ๋ก ์ค๋ ํ๊ฑด ๋ด์ฉ์ด ์ด๋ ค์์.... JPA๋ ๊ทธ๋ ๊ณ ๋ฐ๋ก ๊ณต๋ถ๋ฅผ ๋ ํด์ผ๊ฒ ์ด์....
ํ์ดํ ํด๋ณด๊ฒ ์ต๋๋ค.....
'WINK-(Web & App) > Spring Boot ์คํฐ๋' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[2025 1ํ๊ธฐ ์คํ๋ง ๋ถํธ ์คํฐ๋] ๊น๋ฏผ์ #6์ฃผ์ฐจ (0) | 2025.05.18 |
---|---|
[2025 1ํ๊ธฐ ์คํ๋ง๋ถํธ ์คํฐ๋] ๊ณ ์ค์ #6์ฃผ์ฐจ (2) | 2025.05.18 |
[2025 1ํ๊ธฐ ์คํ๋ง ๋ถํธ ์คํฐ๋] ์ ๋ค์ #6์ฃผ (1) | 2025.05.18 |
[2025 1ํ๊ธฐ ์คํ๋ง๋ถํธ ์คํฐ๋] ์์คํ #5์ฃผ์ฐจ (0) | 2025.05.13 |
[2025 1ํ๊ธฐ ์คํ๋ง๋ถํธ ์คํฐ๋] ์ฅ๋ฏผ์ฃผ #5์ฃผ์ฐจ (0) | 2025.05.13 |