GitHub

https://github.com/Choidongjun0830

Spring 78

[Spring DB 1편 듣고 복습, 토이 프로젝트 수정] 1.JDBC 이해

JDBC의 등장 이유 데이터베이스마다 커넥션을 연결하는 방법, SQL을 전달하는 방법, 결과를 응답받는 방법이 모두 달라서 원래 사용하면 데이터베이스 기술에서 다른 기술로 변경하면 데이터베이스 사용 코드도 함께 변경해야하고, 개발자도 각각의 데이터베이스 기술을 새로 학습하여야 한다. -> JDBC라는 자바 표준이 등장. JDBC는 자바에서 데이터 베이스에 접속할 수 있도록 하는 자바 API이다. java.sql.Connection(연결), java.sql.Statement(SQL을 담은 내용), java.sql.ResultSet(SQL 요청 응답)의 인터페이스를 정의해두었고, 각각의 DB 회사에서 자신의 DB에 맞도록 구현해서 라이브러리로 제공한다. (MySQL JDBC 드라이버, Oracel JDBC ..

Spring 2024.02.20

스프링으로 예외처리와 반복 문제 해결

서비스 계층은 특정 기술에 의존하지 않고, 순수하게 유지하는 것이 좋은데 그러려면 예외에 대한 의존도 해결해야 한다. 서비스 계층에서 처리할 수 없는 예외에 대한 의존을 제거하려면 체크 예외를 런타임 예외로 전환해서 서비스 계층에 던져야 한다. 그러면 서비스 계층에서 무시할 수 있기 때문에, 특정 구현 기술에 의존하는 부분을 제거하고 서비스 계층을 순수하게 유지할 수 있다. 인터페이스 인터페이스를 도입해서 구현 기술의 버전이 바뀌면 쉽게 변경할 수 있도록 할 수 있다. 하지만 인터페이스 구현체가 체크 예외를 던지려면, 인터페이스 메서드에 먼저 체크 예외를 던지는 부분이 있어야 한다. 인터페이스가 특정 구현 기술에 종속적인 체크 예외를 사용하게 되면 순수한 인터페이스를 만들 수 없다. 인터페이스를 만드는 ..

Spring 2024.02.19

스프링으로 트랜잭션 문제 해결

프레젠테이션 계층(컨트롤러), 서비스 계층, 데이터베이스 접근 계층 중 가장 중요한 것은 비즈니스 로직을 담고 있는 서비스 계층이다. 서비스 계층은 가능한 순수한 자바 언어로 이루어져 변경이 자주 일어나지 않도록 해야 한다. 하지만 트랜잭션에서 배우고 실습했던 코드들은 SQLException과 같은 JDBC에 속하는 오류를 담고 있고, MemberRepositoryV1이라는 구체 클래스에 의존되어 있다. 따라서 컨트롤러나 데이터베이스 접근 계층의 변경이 일어나면 서비스 계층도 바꿔야 한다. 트랜잭션은 서비스 계층에서 구현되어야 하는데 트랜잭션 코드를 위한 try catch finally 같은 코드들의 중복도 많다. 그리고 JDBC와 JPA의 트랜잭션 구현 코드도 다르다. 기술을 변경하게 되면 서비스 계층..

Spring 2024.02.13

트랜잭션

트랜잭션 이름 그대로 번역하면 거래 -> 데이터베이스에서 트랜잭션은 하나의 거래를 안전하게 처리하도록 보장해주는 것이다. 예를 들어 A가 B에게 5000원을 송금하면 A의 계좌에서 5000원이 빠지고, B의 계좌에 5000원이 추가되어야 한다. 이 두가지 작업 모두가 성공적으로 이루어져야 문제가 없다. 데이터베이스에서도 모든 작업이 정상적으로 성공하여 반영되는 것을 '커밋(Commit)'이라 하고 하나라도 실패해서 거래 이전으로 돌리는 것을 '롤백(Rollback)'이라 한다. 트랜잭션 ACID Atomicity(원자성) : 트랜잭션 내에서 실행한 작업들은 마치 하나의 작업인 것처럼 모두 성공하거나 실패해야 한다. 일관성(Consistency) : 모든 트랜잭션은 일관성있는 데이터 베이스 상태를 유지해야..

Spring 2024.02.08

커넥션 풀

DB 드라이버를 사용하면 매번 데이터베이스를 사용할 때마다 TCP/IP 커넥션을 맺어야 한다. 그래서 커넥션을 미리 생성해두고 사용하는 커넥션 풀이라는 방법을 사용한다. 애플리케이션이 시작할 때 커넥션 풀은 필요한 만큼 커넥션을 미리 확보해서 보관한다. 커넥션 풀에 들어가 있는 커넥션은 TCP/IP로 데이터베이스와 연결되어 있는 상태라서 언제든지 즉시 SQL을 데이터베이스에 전달할 수 있다. 어플리케이션 로직은 이미 생성되어있는 커넥션을 객체 참조로 가져다쓰기만 하면 된다. 커넥션을 사용하고 나면 커넥션을 종료하는 것이 아니라 살아있는 상태로 커넥션 풀에 반환한다. DataSource 커넥션을 DB 드라이버로 얻다가 커넥션 풀 중 하나인 hikariCP로 바꾸려 하면, 커넥션을 획득하는 어플리케이션 코드..

Spring 2024.02.01

JDBC

클라이언트가 애플리케이션 서버를 통해 데이터를 저장하거나 조회하면, 애플리케이션 서버는 데이터베이스를 사용한다. 커넥션 연결 SQL 전달: 애플리케이션 서버는 DB가 이해할 수 있는 SQL을 연결된 커넥션으로 전달 결과 응답: SQL을 수행하고 결과 응답. JDBC를 직접 코딩할 일은 웬만하면 없다. Sql Mapper나 ORM 기술을 사용하기 때문에 하지만 JDBC를 이해할 필요는 있다. @Slf4j public class DBConnectionUtil { public static Connection getConnection() { try { Connection connection = DriverManager.getConnection(URL, USERNAME, PASSWORD); //라이브러리에 있는 ..

Spring 2024.01.31

Spring Toy Project-1

Mat & Mut이라는 이름으로 커뮤니티 형태를 만들어보고 있다. 토이프로젝트를 하면서 기억해둘 것 th:text -> 요소의 텍스트 내용을 설정하는데 사용한다. ex) th:text="${item.itemName}" th:value -> input이나 select의 값을 설정하는데 사용한다. ex) th:value="${user.name}" th:object -> form이나 반복에서 전달받을 객체나 입력을 담을 객체를 설정하는데 사용한다. th:field -> th:object에서 객체를 설정한 것을 바탕으로 member가 가진 변수 name이나 age 등을 쉽게 설정할 수 있다. /*th:object 사용X*/ /*th:object 사용*/ 검증에서 BindingResult는 @ModelAttrib..

Spring 2024.01.31

스프링 타입 컨버터

@RestController public class HelloController { @GetMapping("/hello-v1") public String helloV1(HttpServletRequest request) { String data = request.getParameter("data"); //문자 타입으로 조회 Integer intValue = Integer.valueOf(data); //숫자 타입으로 변경 System.out.println("intValue = " + intValue); return "ok"; } @GetMapping("hello-v2") //@RequestParam을 사용하면 스프링이 중간에서 타입 변환을 해줌 public String helloV2(@RequestParam..

Spring 2024.01.15

API 예외 처리

API는 각 오류 상황에 맞는 오류 응답 스펙을 정하고, JSON으로 데이터를 내려주어야 한다. 스프링 부트가 제공하는 BasicErrorController는 HTML 페이지를 제공하는 경우에는 편리하지만, API 오류 처리는 각각의 컨트롤러나 예외마다 서로 다른 응답 결과를 출력해야 할 수도 있기 때문에 복잡하다. 'IllegalArgumentException'이 일어나고 아무런 처리를 안해주면 500 에러가 발생하는데 이것을 400에러로 바꾸어 주려면 'ExceptionResolver'를 활용해야 한다. HandlerExceptionResolver 활용 예외 상태 코드 반환 예외를 response.sendError(xxx)로 변경해서 서블릿에서 상태 코드에 따른 오류를 처리하도록 함 이후 WAS는 서..

Spring 2024.01.13
728x90