Maven은 빌드 프로세스를 실행하기 위해 여러개의 LifeCycle을 제공한다. 각 LifeCycle은 특정한 빌드 단계(build phase)를 정의하며 빌드 프로세스는 이 라이프사이클을 따라서 실행된다. There are three built-in build lifecycles: default, clean and site. The default lifecycle handles your project deployment, the clean lifecycle handles project cleaning, while the site lifecycle handles the creation of your project's web site. maven은 LifeCycle은 clean, default, site..
이전 step2 에서 비즈니스 로직과 트랜잭션 로직을 분리하기 위해 UserService(인터페이스) -> UserServiceTx(트랜잭션 로직) -> UserServiceImpl(비즈니스 로직)을 구현했다. 이 구성에는 번거러운 코드 작성과 중복 코드 작성 등의 문제가 있었다. 이를 자바의 리플렉션 API 기능을 이용해 다이내믹 프록시를 만들어 해결할 수 있다. 리플렉션이란 런타임 시점에 객체의 클래스 타입, 필드, 메서드 등의 정보를 동적으로 가져올 수 있는 기능이다. 예를 들어 String name = "LEE_SEUNGHUN" 일 때 이 문자열의 길이를 알고 싶다면 length()라는 메소드를 호출할 것이다. 자바의 모든 클래스는 그 클래스 자체의 구성정보를 담은 Class 타입으 오브젝트를 하..
자바 리플렉션이란 자바 리플렉션 API(Java Reflection API)는 자바 클래스, 인터페이스, 메서드, 필드 등의 정보를 동적으로 검색하고, 분석하고, 조작할 수 있는 기능을 제공한다. 이를 통해 실행 중인 자바 애플리케이션에서 객체를 조작하거나 클래스의 동적 로딩, 메서드 호출 등을 가능하게 한다. // 클래스 로딩 Class myClass = Class.forName("com.example.MyClass"); // 객체 생성 Object myObject = myClass.newInstance(); // 메서드 호출 Method myMethod = myClass.getMethod("myMethod", String.class); myMethod.invoke(myObject, "hello"); ..
스프링 빈은 기본적으로 클래스 이름과 프로퍼티로 정의된다. 스프링은 지정된 클래스 이름을 가지고 리플렉션을 이용해서 해당 클래스의 오브젝트를 만든다. 클래스의 이름을 갖고 있다면 다음과 같은 방법으로 새로운 오브젝트를 생성할 수 있다. Class의 newInstance() 메소드는 해당 클래스의 파라미터가 없는 생성자를 호출하고 그 결과 생성되는 오브젝트를 돌려주는 리플렉션 API 이다. Date now = (Date) Class.forName("java.util.Date").newInstance(); 스프링은 내부적으로 리플렉션 API를 이용해서 빈 정의에 나오는 클래스 이름을 가지고 빈 오브젝트를 생성한다. 클래스 정보를 가지고 디폴트 생성자를 통해 오브젝트를 만드는 방법 외에도 빈을 만들 수 있는 ..
이전에 step1에서 트랜잭션 + AOP 탄생에 대해 간략한 큰 그림을 그려보았다. 그 과정에서 어떤 노력들이 있었는지 확인해보려고 한다. 필자는 토비의 스프링 3.1을 참고하여 나름대로 해석하여 정리한 내용이다. public void upgradeLevels() throws Exception { TransactionStatus status = this.transactionManager.getTransaction(new DefaultTransactionDefinition()); try { List users = userDao.getAll(); for (User user : users){ if(canUpgradeLevel(user)){ upgradeLevel(user); } } this.transactio..
트랜잭션은 데이터베이스 시스템에서 데이터를 일관성있게 처리하기 위한 단위 작업 단위이다. 데이터베이스에 대한 변경 작업은 여러 개의 SQL 문으로 이루어져 있을 수 있는데, 이러한 SQL 문을 하나의 논리적인 작업으로 묶어서 처리하는 것이다. 트랜잭션은 아래와 같은 네가지 특징을 가진다. 원자성(Atomicity): 트랜잭션에 포함된 작업은 전부 성공하거나 전부 실패해야 한다. 즉, 트랜잭션 내의 모든 작업은 한 개의 논리적인 단위로 간주되어야 하며, 어떤 작업이라도 실패하면 트랜잭션 전체가 실패해야 한다. 일관성(Consistency): 트랜잭션은 데이터베이스에 일관성 있는 상태를 유지해야 한다. 즉, 트랜잭션을 수행하기 전과 후의 데이터베이스 상태가 일관성 있어야 한다. 격리성(Isolation): ..