인프런145 5)데이터 접근 기술 - MyBatis MyBatis 소개 MyBatis는 앞서 설명한 JdbcTemplate보다 더 많은 기능을 제공하는 SQL Mapper 이다. 기본적으로 JdbcTemplate이 제공하는 대부분의 기능을 제공한다. JdbcTemplate과 비교해서 MyBatis의 가장 매력적인 점은 SQL을 XML에 편리하게 작성할 수 있고 또 동적 쿼리를 매우 편리하게 작성할 수 있다는 점이다. 먼저 SQL이 여러줄에 걸쳐 있을 때 둘을 비교해보자. jdbcTemplate sql 여러줄 String sql = "update item " + "set item_name=:itemName,price=:price,quantity=:quantity " + "where id =:id"; MyBatis sql 여러줄 update item set .. 인프런/스프링 DB 2편 2023. 3. 8. 4) 데이터 접근 기술 - 테스트 테스트 - 데이터베이스 연동 데이터 접근 기술에 대해서 더 알아보기 전에 데이터베이스에 연동하는 테스트에 대해서 알아보자. 데이터 접근 기술은 실제 데이터베이스에 접근해서 데이터를 잘 저장하고 조회할 수 있는지 확인하는 것이 필요하다 지금부터 테스트를 실행할 때 실제 데이터베이스를 연동해서 진행해보자. 앞서 개발한 ItemRepositoryTest 를 통해서 테스트를 진행할 것이다. 테스트 케이스는 src/test 에 있기 때문에, 실행하면 src/test 에 있는 application.properties 파일이 우선순위를 가지고 실행된다. 그런데 문제는 테스트용 설정에는 spring.datasource.url 과 같은 데이터베이스 연결 설정이 없다는 점이다테스트 케이스에서도 데이터베이스에 접속할 .. 인프런/스프링 DB 2편 2023. 3. 7. 3) 데이터 접근 기술 - 스프링 JdbcTemplate (2) JdbcTemplate - 이름 지정 파라미터 (1) 순서대로 바인딩 JdbcTemplate을 기본으로 사용하면 파라미터를 순서대로 바인딩 한다. 예를 들어서 다음 코드를 보자. @Override public void update(Long itemId, ItemUpdateDto updateParam) { String sql = "update item set item_name=?,price=?,quantity=? where id =?"; template.update(sql, updateParam.getItemName(), updateParam.getPrice(), updateParam.getQuantity(), itemId); } 여기서는 itemName , price , quantity 가 SQL에 있는.. 인프런/스프링 DB 2편 2023. 3. 7. 2) 데이터 접근 기술 - 스프링 JdbcTemplate (1) JdbcTemplate 소개와 설정 SQL을 직접 사용하는 경우에 스프링이 제공하는 JdbcTemplate은 아주 좋은 선택지다. JdbcTemplate 은 JDBC를 매우 편리하게 사용할 수 있게 도와준다 (이전에 DB1 마지막편에서 리포지토리의 반복되는코드를 스프링의 템플릿을 도입해서 해결했다) 장점 설정의 편리함 JdbcTemplate은 spring-jdbc 라이브러리에 포함되어 있는데, 이 라이브러리는 스프링으로 JDBC를 사용할 때 기본으로 사용되는 라이브러리이다. 그리고 별도의 복잡한 설정 없이 바로 사용할 수 있다. 반복 문제 해결 JdbcTemplate은 템플릿 콜백 패턴을 사용해서, JDBC를 직접 사용할 때 발생하는 대부분의 반복 작업을 대신 처리해준다. 개발자는 SQL을 작성하고, 전.. 인프런/스프링 DB 2편 2023. 3. 6. 1) 데이터 접근 기술 - 시작 데이터 접근 기술 SQL Mapper JdbcTemplate MyBatis ORM 관련 기술 (ORM ==> Object Relational Mapping) JPA, Hibernate 스프링 데이터 JPA Querydsl SQL Mapper 주요기능 개발자는 SQL만 작성하면 SQL Mapper 기술은 해당 SQL의 결과를 객체로 편리하게 매핑해준다. JDBC를 직접 사용할 때 발생하는 여러가지 중복을 제거해주고, 기타 개발자에게 여러가지 편리한 기능을 제공한다 ORM 주요 기능 JdbcTemplate이나 MyBatis 같은 SQL 매퍼 기술은 SQL을 개발자가 직접 작성해야 하지만, JPA를 사용하면 기본적인 SQL은 JPA가 대신 작성하고 처리해준다. 개발자는 저장하고 싶은 객체를 마치 자바 컬렉션에.. 인프런/스프링 DB 2편 2023. 3. 6. 끝) 자바 예외 + 스프링의 문제해결 체크 예외와 인터페이스 서비스 계층은 가급적 특정 구현 기술에 의존하지 않고, 순수하게 유지하는 것이 좋다. 이렇게 하려면 예외에 대한 의존도 함께 해결해야한다. 예를 들어서 서비스가 처리할 수 없는 SQLException 에 대한 의존을 제거하려면 어떻게 해야할까? ( SQLException 에 대한 의존한다는것은 throws SQLException을 의미) 서비스가 처리할 수 없으므로 리포지토리가 던지는 SQLException 체크 예외를 런타임 예외로 전환해서 서비스 계층에 던지자. 이렇게 하면 서비스 계층이 해당 예외를 무시할 수 있기 때문에, 특정 구현 기술에 의존하는 부분을 제거하고 서비스 계층을 순수하게 유지할 수 있다. 지금부터 코드로 이 방법을 적용해보자. 인터페이스 도입 먼저 Membe.. 인프런/스프링 DB 1편 2023. 2. 27. 8) 자바 예외 - checked Exception , unchecked Exception (2) 체크 예외 활용 그렇다면 언제 체크 예외를 사용하고 언제 언체크(런타임) 예외를 사용하면 좋을까? 기본 원칙은 다음 2가지를 기억하자 1. 기본적으로 언체크(런타임) 예외를 사용하자. 2. 체크 예외는 비즈니스 로직상 의도적으로 던지는 예외에만 사용하자. 이 경우 해당 예외를 잡아서 반드시 처리해야 하는 문제일 때만 체크 예외를 사용해야 한다. 예를 들어서 다음과 같은 경우가 있다. 체크 예외 예) 계좌 이체 실패 예외 결제시 포인트 부족 예외 로그인 ID, PW 불일치 예외 물론 이 경우에도 100% 체크 예외로 만들어야 하는 것은 아니다. 다만 계좌 이체 실패처럼 매우 심각한 문제는 개발자가 실수로 예외를 놓치면 안된다고 판단할 수 있다. 이 경우 체크 예외로 만들어 두면 컴파일러를 통해 놓친 예외를.. 인프런/스프링 DB 1편 2023. 2. 27. 7) 자바 예외 (Exception) , 체크예외, 언체크예외 자바 예외 이해 예외 계층 스프링이 제공하는 예외 추상화를 이해하기 위해서는 먼저 자바 기본 예외에 대한 이해가 필요하다. 예외는 자바 언어의 기본 문법에 들어가기 때문에 대부분 아는 내용일 것이다. 예외의 기본 내용을 간단히 복습하고, 실무에 필요한 체크 예외와 언체크 예외의 차이와 활용 방안에 대해서도 알아보자. 예외 계층 그림 Object : 예외도 객체이다. 모든 객체의 최상위 부모는 Object 이므로 예외의 최상위 부모도 Object 이다. Throwable : 최상위 예외이다. 하위에 Exception 과 Error 가 있다. (Error도 언체크) Error 메모리 부족이나 심각한 시스템 오류와 같이 애플리케이션에서 복구 불가능한 시스템 예외이다. 애플리케이션 개발자는 이 예외를 잡으려고 .. 인프런/스프링 DB 1편 2023. 2. 26. 6)트랜잭션 + 스프링 (2) 트랜잭션 문제 해결 - 트랜잭션 매니저 (2) 그림으로 트랜잭션 매니저의 전체 동작 흐름을 자세히 이해해보자 트랜잭션 매니저 Step1 - 트랜잭션 시작 클라이언트의 요청으로 서비스 로직을 실행한다. 1. 서비스 계층에서 transactionManager.getTransaction() 을 호출해서 트랜잭션을 시작한다. 2. 트랜잭션을 시작하려면 먼저 DataBase Connection이 필요하다. 트랜잭션 매니저는 내부에서 데이터소스를 사용해서 커넥션을 생성한다. (커넥션 생성 또는 커넥션풀에서 받는다.) 3. 커넥션을 수동 커밋 모드로 변경해서 실제 데이터베이스 트랜잭션을 시작한다. 4. 커넥션을 트랜잭션 동기화 매니저에 보관한다. 5. 트랜잭션 동기화 매니저는 쓰레드 로컬에 커넥션을 보관한다. 따라서.. 인프런/스프링 DB 1편 2023. 2. 25. 5) 트랜잭션 + 스프링 스프링과 문제 해결 ( 트랜잭션 ) 문제점들 애플리케이션 구조 여러가지 애플리케이션 구조가 있지만, 가장 단순하면서 많이 사용하는 방법은 역할에 따라 3가지 계층으로 나누는 것이다. 프레젠테이션 계층 UI와 관련된 처리 담당 웹 요청과 응답 사용자 요청을 검증 주 사용 기술: 서블릿과 HTTP 같은 웹 기술, 스프링 MVC 서비스 계층 비즈니스 로직을 담당 주 사용 기술: 가급적 특정 기술에 의존하지 않고, 순수 자바 코드로 작성 데이터 접근 계층 실제 데이터베이스에 접근하는 코드 주 사용 기술: JDBC, JPA, File, Redis, Mongo ... 순수한 서비스 계층 여기서 가장 중요한 곳은 어디일까? 바로 핵심 비즈니스 로직이 들어있는 서비스 계층이다. 시간이 흘러서 UI(웹)와 관련된 부분이.. 인프런/스프링 DB 1편 2023. 2. 21. 4) 트랜잭션 적용(2) 트랜잭션 - 적용1 실제 애플리케이션에서 DB 트랜잭션을 사용해서 계좌이체 같이 원자성이 중요한 비즈니스 로직을 어떻게 구현하는지 알아보자. 먼저 트랜잭션 없이 단순하게 계좌이체 비즈니스 로직만 구현해보자. MemberServiceV1 @RequiredArgsConstructor public class MemberServiceV1 { private final MemberRepositoryV1 memberRepository; public void accountTransfer(String fromId, String toId, int money) throws SQLException { Member fromMember = memberRepository.findById(fromId); Member toMember.. 인프런/스프링 DB 1편 2023. 2. 20. 3) 트랜잭션 ( Transaction ) 의 이해 , DB Lock 트랜잭션 - 개념 이해 데이터를 저장할 때 단순히 파일에 저장해도 되는데, 데이터베이스에 저장하는 이유는 무엇일까? 여러가지 이유가 있지만, 가장 대표적인 이유는 바로 데이터베이스는 트랜잭션이라는 개념을 지원하기 때문이다. 트랜잭션을 이름 그대로 번역하면 거래라는 뜻이다. 이것을 쉽게 풀어서 이야기하면, 데이터베이스에서 트랜잭션은 하나의 거래를 안전하게 처리하도록 보장해주는 것을 뜻한다. 그런데 하나의 거래를 안전하게 처리하려면 생각보다 고려해야 할 점이 많다. 예를 들어서 A의 5000원을 B에게 계좌이체한다고 생각해보자. A의 잔고를 5000원 감소하고, B의 잔고를 5000원 증가해야한다. 5000원 계좌이체 1. A의 잔고를 5000원 감소 2. B의 잔고를 5000원 증가 계좌이체라는 거래는 이.. 인프런/스프링 DB 1편 2023. 2. 20. 이전 1 ··· 3 4 5 6 7 8 9 ··· 13 다음