Spring/Spring 3.1
[Spring 3.1] 스프링 MVC 애너테이션
[Spring 3.1] 스프링 MVC 애너테이션
2023.06.02@RequestMapping 스프링 MVC는 핸들러 매핑으로 메서드를 연결해준다. // 슬래시로 끝나지 않으면 hello.* hello/ 도 함께 매핑됨 @RequestMapping("/hello") public String hello() { ... } // @GetMapping을 이런식으로 구현 @RequestMapping(value = "/hello" method = RequestMethod.GET) public String hello() { ... } // 매핑에 요청 파라미터 지정 가능 @RequestMapping(value = "/hello" params="type=admin") public String hello() { ... } @RequestMapping(value = "/hello" pa..
[Spring 3.1] 스프링 MVC와 웹 기술 - 핸들러
[Spring 3.1] 스프링 MVC와 웹 기술 - 핸들러
2023.05.13스프링은 웹 기술에서 독립적인 루트 애플리케이션 컨텍스트와 웹 기술 기반으로 동작하는 서블릿 애플리케이션 컨텍스트 두 가지로 애플리케이션 컨텍스트를 분리해서 구성한다. (계층 구조로 구성돼 서블릿 애플리케이션 컨텍스트는 루트 애플리케이션 컨텍스트에 접근할 수 있다) 루트 애플리케이션 컨텍스트에서는 서비스, 리포지토리 등 웹과 관련된 기능을 제외한 모든 빈을 관리하고, 서블릿 애플리케이션 컨텍스트에서는 핸들러 매핑, 뷰 리졸버 등 웹과 관련된 빈들을 관리한다. 배치 작업 등 웹과 관련되지 않은 애플리케이션은 웹 관련 빈들을 관리하는 서블릿 애플리케이션 컨텍스트가 필요하지 않다. 이렇게 애플리케이션을 두 개로 분리하면 서블릿 애플리케이션 컨텍스트를 다른 기술로 교체하거나 제거할 수 있어 애플리케이션을 효과적..
[Spring 3.1] 데이터 엑세스 기술
[Spring 3.1] 데이터 엑세스 기술
2023.05.11스프링은 보통 JDBC API를 사용해 데이터베이스와 연결해서 동작하고, 데이터 접근을 위한 여러 가지 추상화와 통합 기술을 지원한다. JPA, Spring Data JPA, MyBatis 등... 데이터 엑세스 관련 다양한 기술들이 있지만, 모두 내부적으로 JDBC API를 사용하고 있다. (추상화 되어 있어 개발자는 해당 기술이 JDBC API를 사용하고 있는지 알 필요는 없다) 100명의 사용자가 스프링으로 구축한 서버에 접속한다고 생각해 보자. 스프링 애플리케이션은 실행될 때 미리 빈들을 등록하고 주입하는 역할을 수행하고, 미리 주입된 빈들을 사용해서 사용자의 요청을 처리한다. 주입된 빈의 스코프가 싱글톤이라고 해 보자. 싱글톤 스코프를 가지는 빈은 애플리케이션 컨텍스트 내부에서 한 번만 생성하고..
[Spring 3.1] IoC 컨테이너와 스프링의 동작 원리
[Spring 3.1] IoC 컨테이너와 스프링의 동작 원리
2023.05.10DI 구현을 통한 IoC는 스프링이 제공하는 대표적인 기능 중 하나이고, DI 설정 방식과 IoC 컨테이너의 활용 방법은 매우 다양하다. 스프링은 오브젝트를 코드로 관리하는 대신 독립된 컨테이너가 관리하도록 해 IoC를 구현한다. 해당 컨테이너는 오브젝트의 생성과 주입을 포함한 여러 가지 기능을 포함하고, 이 컨테이너를 애플리케이션 컨텍스트라고 부른다. (빈 팩토리는 DI 작업을 하는 컨테이너만을 부르고, 애플리케이션 컨텍스트는 다른 기능이 추가된 컨테이너이다) 빈 팩토리는 빈의 생성, 초기화, DI 등 생명주기를 담당하고 팩토리 빈은 복잡한 생성 로직이 필요한 빈을 만들 때 빈의 생성 과정을 완전하게 제어할 때 사용한다. 빈 팩토리를 확장해서 애플리케이션 컨텍스트 (IoC 컨테이너) 로 사용하고, 팩토..
[Spring 3.1] Annotation
[Spring 3.1] Annotation
2023.05.04Java 5 버전에서 애너테이션이 등장하고 스프링 3.1 버전부터는 애너테이션을 사용해 메타 정보를 작성하는 방식을 사용해 xml을 사용하는 경우가 많이 줄어들었다. 애너테이션은 작성하는 코드에 비해 부가적으로 얻을 수 있는 정보가 많아 애플리케이션의 코드를 간추릴 수 있다. 당장 @Transactional 애너테이션만 생각해도 그렇다. 별도의 트랜잭션 관련 설정 없이 애너테이션 하나로 트랜잭션 관련 설정을 모두 진행할 수 있다. 이렇듯 애너테이션이 사용되는 정책과 관례를 잘 이해하고 있다면 애너테이션을 사용해 코드를 간결하게 작성할 수 있다. xml을 사용하든 애너테이션을 사용하든 스프링이 동작하는 핵심 원리는 변하지 않는다. 단, 어떤 방법을 사용하든 그 방법이 어떻게 핵심 원리를 구현하는지 이해하고..
[Spring 3.1] Aspect Oriented Programming
[Spring 3.1] Aspect Oriented Programming
2023.04.28Service 계층에서 비즈니스 로직과 트랜잭션 설정 관련 로직을 분리했지만, 여전히 트랜잭션 경계 설정을 위해 비즈니스 로직의 앞뒤로 관련된 코드가 붙어 있는 상황이다. 두 부분을 분리할 수는 없을까? Service 계층에는 비즈니스 로직만 포함하면 좋을 텐데.. Service 계층을 인터페이스로 설계하고 두 가지 클래스를 구현 클래스로 설정해보자. 하나는 비즈니스 관련 로직만을 다루고, 나머지 하나는 트랜잭션 관련 설정 로직만을 다룬다. ServiceTx 구현체에서는 ServiceImpl에게 작업을 위임한다. 트랜잭션 관련 설정은 알아서 처리하고, 비즈니스 관련 로직을 처리해야 하는 경우 ServiceImpl을 DI 받아서 해당 구현체가 처리하도록 설계한다. 작업을 거듭할수록 Service 계층이 점..
[Spring 3.1] 트랜잭션과 서비스 추상화
[Spring 3.1] 트랜잭션과 서비스 추상화
2023.04.23스프링은 트랜잭션을 구현할 때 TransactionSynchronizations 방식을 사용한다. Connection 객체를 특별한 저장소에 보관해두고 이후 하나의 트랜잭션 내부에서 호출되는 다른 메서드를 수행할 때는 저장소에 저장된 Connection을 가져가서 사용하는 방식이다. Service에서 Connection을 생성하고 저장소에 Connection을 저장한 후 트랜잭션을 시작한다. 이후 서비스의 메서드를 수행할 때는 저장소에 Connection 객체가 있는지 확인한다. 트랜잭션 내부의 작업이 모두 끝났을 때 커밋을 호출해 트랜잭션을 완료시킨 후 Connection을 제거한다. 작업 스레드마다 독립적으로 Connection을 사용하기에 멀티스레드 환경에서도 충돌이 나지 않는다. JdbcTempl..
[Spring 3.1] 스프링과 예외처리
[Spring 3.1] 스프링과 예외처리
2023.04.20자바에서 예외는 세 가지 종류로 구분된다. 1. Error 클래스 OutOfMemoryError, ThreadDeath 같이 시스템에 비정상적인 상황이 발생한 경우 나타나는 예외이다. 애플리케이션에서는 신경쓰지 않아도 된다. 2. Exception 체크 예외 Exception 클래스의 하위 클래스 중 RuntimeException 클래스를 상속받지 않은 클래스를 의미한다. 3. Exception 언체크 예외 Exception 클래스의 하위 클래스 중 RuntimeException 클래스를 상속받은 클래스를 의미한다. 체크 예외가 발생할 수 있는 메서드에서는 반드시 예외를 처리하는 코드를 추가해야 한다. (컴파일 시점에서 검증된다) 언체크 예외를 처리하는 코드는 강제되지 않는다. 언체크 예외에 대해 알고 ..
[Spring 3.1] 템플릿과 콜백
[Spring 3.1] 템플릿과 콜백
2023.04.19템플릿은 코드 중에서 변하지 않는 부분을 변하는 부분으로부터 독립시켜 효과적으로 활용하는 기법을 말한다. 스프링 프레임워크에 적용된 템플릿 기법을 살펴보고 Data Access Object에 적용해보자. DAO는 데이터베이스와 연결하는 부분이 필수적으로 포함된다. 데이터베이스와의 연결은 Connection Pool을 통해 이루어지고, 커넥션을 모두 사용했다면 반환해 다시 풀에 넣어 줘야 한다. try { // connect.. } catch (Exception e) { } finally { // close.. } 어떤 상황에서도 가져온 리소스를 반환할 수 있도록 try-catch-finally 구문을 사용한다. 제대로 작성한다면 커넥션 풀이 꽉 차는 현상은 막을 수 있지만.. DAO를 작성할 때 마다 t..
[Spring 3.1] 스프링과 테스트
[Spring 3.1] 스프링과 테스트
2023.04.16웹 애플리케이션을 제작하고 제대로 동작하는지 테스트하려면 어떻게 해야 할까? 특정 기능을 테스트하기 위해 해당 테스트와 연계된 서비스, 컨트롤러, 뷰, 웹 서버 환경을 모두 구축해야 테스트 할 수 있다. 여기서 테스트가 실패한다면? 테스트하려는 특정 기능에서 오류가 발생했는지, 아니면 다른 연계된 기능에서 오류가 발생했는지 확인하기 전에 알 수 없다. 즉, 웹 서버를 띄워서 테스트하는 경우 디버깅 비용이 매우 많이 발생한다. 테스트하려는 대상이 명확한 경우 그 대상에만 집중해서 테스트를 진행하는 편이 합리적이다. 이렇게 작은 단위의 코드에 대해 진행하는 테스트를 단위 테스트라고 부른다. 자바는 JUnit 테스트 프레임워크를 제공해 개발자가 단위 테스트를 쉽게 진행할 수 있도록 도와준다. (개발의 전반적인..
[Spring 3.1] 관심사의 분리와 스프링
[Spring 3.1] 관심사의 분리와 스프링
2023.04.13추후 유지 보수를 고려했을 때 관심사 (도메인) 를 작업 단위로 소스코드를 분리해서 작성하는 편이 합리적이다. 이런 측면에서 추상 클래스와 인터페이스는 매우 중요하다. 확장성 있는 애플리케이션을 구현하기 위해 디자인패턴 중 템플릿 메서드 패턴을 사용한다. abstract class Car { public void doorOpen() { } public abstract void drive() { } } class ACar extends Car { public void drive() {...} } 슈퍼 클래스에 기본적인 로직을 만들어 놓고, 일부 기능을 추상 메서드로 만든다. 이후 서브 클래스에서 해당 메서드를 필요에 따라 구현해서 사용하도록 하는 패턴이다. 변화의 성격이 다른 것들을 분리해서 서로 영향을 ..