본문 바로가기

체크예외, 언체크예외(런타임예외) 사용방법 1. 체크 예외, 언체크 예외를 언제 쓸 것인가? 기본적으로 언체크(런타임) 예외를 사용하자. 비즈니스 로직상 해당 예외를 잡아서 반드시 처리해야 하는 문제일 때만 사용 복구가 너무 중요할 때 후처리가 필요한 경우에 사용 ex) 계좌 이체 실패 , 결제시 포인트 부족, 로그인 ID, PW 불일치 등의 예외 체크 예외로 만들어 두면, 컴파일러를 통해 실수로 놓친 예외를 인지할 수 있다. 2. 체크 예외의 문제점 1) 복구 불가능한 예외의 경우 체크 예외 중에서 SQLException 처럼 데이터베이스에서 발생하는 문제들은 대부분 애플리케이션 로직에서 복구가 불가능해 처리할 방법이 없다. 어차피 처리할 방법이 없기에 리포지토리 > 서비스 > 컨트롤러에서 모두 던질 수 밖에 없음 해결 할 수도 없는 예외를 계..
체크예외 vs 언체크예외 스프링이 제공하는 예외 추상화를 이해하기 위해서는 먼저 자바 기본 예외에 대한 이해가 필요하다. 애플리케이션 로직은 Exception 부터 필요한 예외로 생각하고 잡으면 된다. 체크 예외 : Exception 하위 > 컴파일러가 체크하는 예외 > 처리 안하면 컴파일 오류 언체크 예외 : RuntimeException하위는 언체크 예외 > 컴파일러가 체크 안함 > 런타임 예외 1. 예외 처리 방법은2가지 잡아서 처리하거나 던지거나 잡거나 던질때 그 자식들도 함께 처리된다 2. 체크 예외의 장단점 체크 예외는 예외를 잡아서 처리할 수 없을 때, 예외를 밖으로 던지는 throws 예외를 필수로 선언해야 한다. 안하면 컴파일 오류가 발생 장점: 예외를 누락하지 않도록 컴파일러를 통해 실수를 잡아주는 안전 장치 ..
스프링 트랜잭션 추상화 1. 트랜잭션 추상화 기존의 문제점과 추상화를 통한 해결법 트랜잭션은 원자적 단위의 비즈니스 로직을 처리하기 위해 사용한다. 그런데 구현 기술마다 트랜잭션을 사용하는 방법이 다르다. 서비스 계층은 트랜잭션을 사용하기 위해서 JDBC 기술에 의존하고 있다고 가정하자 향후 JDBC에서 JPA 같은 다른 데이터 접근 기술로 변경하면, 서비스 계층의 트랜잭션 관련 코드도 모두 함께 수정되어야 하는 문제점이 있다. 이렇게 변경포인트가 하나일때 여러군데서 터지면..단일책임원칙에 맞지 않다. 해결 방법은 트랜잭션 기능을 추상화 시켜라 트랜잭션은 사실 단순하다. 트랜잭션을 시작하고, 비즈니스 로직의 수행이 끝나면 커밋하거나 롤백하면 된다. 서비스는 특정 트랜잭션 기술에 직접 의존하는 것이 아니라, 추상화된 인터페이스(..
애플리케이션 구조 3계층 1. 애플리케이션 구조 3계층 프레젠테이션 계층 : UI와 관련된 처리 담당, 웹 요청과 응답, 사용자 요청을 검증, 주 사용 기술 > 서블릿과 HTTP 같은 웹 기술, 스프링 MVC 데이터 접근 계층 : 실제 데이터베이스에 접근하는 코드, 주 사용 기술 > JDBC, JPA, Redis등 서비스 계층 : 비즈니스 로직을 담당, 주 사용 기술 >가급적 특정 기술에 의존하지 않고, 순수 자바 코드로 작성 이렇게 계층을 나눈 이유도 서비스 계층을 최대한 순수하게 유지하기 위한 목적이 크다. 기술에 종속적인 부분은 프레젠테이션 계층, 데이터 접근 계층에서 가지고 간다. 2. 중요한 서비스 계층 서비스 계층은 핵심 비즈니스 로직이 들어있는 계층 비즈니스 로직은 최대한 변경없이 유지되어야 한다. 서비스 계층은 순..
자동 커밋 VS 수동 커밋 1. 자동 커밋 자동 커밋으로 설정하면 각각의 쿼리 실행 직후에 자동으로 바로 커밋을 호출한다.(트랙잭션이 발생하고 끝남) 따라서 커밋이나 롤백을 직접 호출하지 않아도 되는 편리함이 있다. 하지만 쿼리를 하나하나 실행할 때 마다 자동으로 커밋이 되어버리기 때문에 우리가 원하는 트랜잭션 기능을 제대로 사용할 수 없다. . 2. 수동 커밋 따라서 commit , rollback 을 직접 호출하면서 트랜잭션 기능을 제대로 수행하려면 자동 커밋을 끄고 수동 커밋을사용해야 한다. 보통 자동 커밋 모드가 기본으로 설정된 경우가 많기 때문에, 수동 커밋 모드로 설정하는 것을 트랜잭션을 시작한다고표현할 수 있다. 수동 커밋 설정을 하면 이후에 꼭 commit , rollback 을 호출해야 한다
데이터베이스 연결 구조와 DB 세션 이해 사용자는 웹 애플리케이션 서버(WAS)나 DB 접근 툴 같은 클라이언트를 사용해서 데이터베이스 서버에 접근할수 있다. 클라이언트는 데이터베이스 서버에 연결을 요청하고 커넥션을 맺게 된다. 이때 데이터베이스 서버는 내부에 세션이라는 것을 만든다. 그리고 앞으로 해당 커넥션을 통한 모든 요청은 이 세션을 통해서 실행하게 된다. 쉽게 이야기해서 개발자가 클라이언트를 통해 SQL을 전달하면 현재 커넥션에 연결된 세션이 SQL을 실행한다. 세션은 트랜잭션을 시작하고, 커밋 또는 롤백을 통해 트랜잭션을 종료한다. 그리고 이후에 새로운 트랜잭션을 다시 시작할 수 있다. 사용자가 커넥션을 닫거나, 또는 DBA(DB 관리자)가 세션을 강제로 종료하면 세션은 종료된다. 커넥션 풀이 10개의 커넥션을 생성하면, 세션도 10..
트랜잭션, ACID(원자성,일관성,지속성,격리성), 트랜잭션 격리 수준 1. 트랜잭션이란? 트랜잭션을 이름 그대로 번역하면 거래라는 뜻이다. 데이터베이스에서 트랜잭션은 하나의 거래를 안전하게 처리하도록 보장해주는 것을 뜻한다. 데이터를 저장할 때 데이터베이스에 저장하는 이유 중 대표적인 것은 데이터베이스는 트랜잭션이라는 개념을 지원하기 때문이다. 예를 들어 계좌이체라는 거래는 A의 잔고 감소, B의 잔고 증가 이렇게 2가지 작업이 합쳐져서 하나의 작업처럼 동작해야 한다. 데이터베이스가 제공하는 트랜잭션 기능을 사용하면 2가지 둘다 함께 성공해야 저장하고, 중간에 하나라도 실패하면 거래전의 상태로 2가지 모두 돌아가야 한다. 모든 작업이 성공해서 데이터베이스에 정상 반영하는 것을 커밋( Commit )이라 하고, 작업 중 하나라도 실패해서 거래이전으로 되돌리는 것을 롤백( R..
OCP(Open-Closed Principle) 원칙과 전략 패턴Strategy Pattern OCP(Open-Closed Principle) 원칙 좋은 객체 지향 설계 원칙 중 하나로 OCP 원칙이라는 것이 있다. Open for extension: 새로운 기능의 추가나 변경 사항이 생겼을 때, 기존 코드는 확장할 수 있어야 한다. Closed for modification: 기존의 코드는 수정되지 않아야 한다. 확장에는 열려있고, 변경에는 닫혀 있다는 뜻인데, 쉽게 이야기해서 기존의 코드 수정 없이 새로운 기능을 추가할 수 있다는 의미다. 확장에 열려있다는 의미: 인터페이스를 구현해서 기능을 추가할 수 있다는 의미이다. 그리고 이 인터페이스를 사용하는 클라이언트 코드도 인터페이스를 통해 새롭게 추가된 기능을 자유롭게 호출할 수 있다. 이것이 확장에 열려있다는 의미이다. 코드 수정은 닫혀 있다는..