일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- springdatajpa
- 자바
- SpringBoot
- Proxy
- transaction
- QueryDSL
- 스프링 핵심 원리
- JPQL
- 알고리즘
- Spring Boot
- 인프런
- db
- AOP
- 백준
- pointcut
- http
- 김영한
- Thymeleaf
- Greedy
- 스프링 핵심 기능
- 그리디
- JDBC
- 스프링
- jpa
- Android
- kotlin
- java
- Servlet
- spring
- Exception
- Today
- Total
목록JDBC (14)
개발자되기 프로젝트
애플리케이션에서 트랜잭션을 어떤 계층에 걸어야 할까? 쉽게 이야기해서 트랜잭션을 어디에서 시작하고, 어디에서 커밋해야할까? 비즈니스 로직과 transaction 트랜잭션은 비즈니스 로직이 있는 서비스 계층에서 시작해야 한다. 비즈니스 로직이 잘못되면 해당 비즈니스 로직으로 인해 문제가 되는 부분을 함께 롤백해야 하기 때문이다. 그런데 트랜잭션을 시작하려면 커넥션이 필요하다. 결국 서비스 계층에서 커넥션을 만들고, 트랜잭션 커밋 이후에 커넥션을 종료해야 한다. 애플리케이션에서 DB 트랜잭션을 사용하려면 트랜잭션을 사용하는 동안 같은 커넥션을 유지해야한다. 그래야 같은 세션을 사용할 수 있다. 커넥션과 세션 애플리케이션에서 같은 커넥션을 유지하려면 어떻게 해야할까? 가장 단순한 방법은 커넥션을 파라미터로 전..
MemberServiceV1 package hello.jdbc.service; import hello.jdbc.domain.Member; import hello.jdbc.repository.MemberRepositoryV1; import lombok.RequiredArgsConstructor; import java.sql.SQLException; @RequiredArgsConstructor public class MemberServiceV1 { private final MemberRepositoryV1 memberRepository; private void accountTransfer(String fromId, String toId, int money) throws SQLException { Member..
package hello.jdbc.repository; import hello.jdbc.domain.Member; import lombok.extern.slf4j.Slf4j; import org.springframework.jdbc.support.JdbcUtils; import javax.sql.DataSource; import java.sql.*; import java.util.NoSuchElementException; /** * JDBC - DataSource 사용, JDBCUtils 사용 */ @Slf4j public class MemberRepositoryV1 { private final DataSource dataSource; public MemberRepositoryV1(DataSource d..
이번에는 DataSource 를 통해 커넥션 풀을 사용해보자. @Test void dataSourceConnectionPool() throws SQLException, InterruptedException { //커넥션 풀링 HikariDataSource dataSource = new HikariDataSource(); dataSource.setJdbcUrl(URL); dataSource.setUsername(USERNAME); dataSource.setPassword(PASSWORD); dataSource.setMaximumPoolSize(10); dataSource.setPoolName("MyPool"); userDataSource(dataSource); Thread.sleep(1000); } pri..
ConnectionTest - 드라이버 매니저 @Test void driverManager() throws SQLException { Connection con1 = DriverManager.getConnection(URL, USERNAME, PASSWORD); Connection con2 = DriverManager.getConnection(URL, USERNAME, PASSWORD); log.info("connection={}, class={}",con1, con1.getClass()); log.info("connection={}, class={}",con2, con2.getClass()); } ConnectionTest - 데이터소스 드라이버 매니저 추가 스프링이 제공하는 DataSource 가 적..
DataSource 이해 커넥션을 얻는 방법은 앞서 학습한 JDBC DriverManager 를 직접 사용하거나, 커넥션 풀을 사용하는 등 다양한 방법이 존재한다. Connection을 획득하는 다양한 방법 DriverManager를 통해 커넥션 획득 우리가 앞서 JDBC로 개발한 애플리케이션 처럼 DriverManager 를 통해서 커넥션을 획득하다가, 커넥션 풀을 사용하는 방법으로 변경하려면 어떻게 해야할까??? DriverManager를 통해 커넥션 획득하다가 커넥션 풀로 변경시 문제점 예를 들어서 애플리케이션 로직에서 DriverManager 를 사용해서 커넥션을 획득하다가 HikariCP 같은 커넥션 풀을 사용하도록 변경하면 커넥션을 획득하는 애플리케이션 코드도 함께 변경해야 한다. 의존관계가 ..
데이터베이스 커넥션을 매번 획득 1. 애플리케이션 로직은 DB 드라이버를 통해 커넥션을 조회한다. 2. DB 드라이버는 DB와 TCP/IP 커넥션을 연결한다. 물론 이 과정에서 3 way handshake 같은 TCP/IP 연결을 위한 네트워크 동작이 발생한다. 3. DB 드라이버는 TCP/IP 커넥션이 연결되면 ID, PW와 기타 부가정보를 DB에 전달한다. 4. DB는 ID, PW를 통해 내부 인증을 완료하고, 내부에 DB 세션을 생성한다. 5. DB는 커넥션 생성이 완료되었다는 응답을 보낸다. 6. DB 드라이버는 커넥션 객체를 생성해서 클라이언트에 반환한다. 이렇게 커넥션을 새로 만드는 것은 과정도 복잡하고 시간도 많이 많이 소모된다..ㅜ DB는 물론이고 애플리케이션 서버에서도 TCP/IP 커넥션..
수정과 삭제는 앞서 살펴본 등록과 비슷하다. 데이터를 변경하는 쿼리를 executeUpdate()를 통해 실행하면 된다. 두 메서드는 쿼리만 다르고 전체 흐름을 동일하다. public void update(String memberId, int money) throws SQLException { String sql = "update member set money=? where member_id=?"; Connection con = null; PreparedStatement pstmt = null; try { con = getConnection(); pstmt = con.prepareStatement(sql); pstmt.setInt(1, money); //첫 번째 파라미터 바인딩 pstmt.setStrin..