데코레이터 패턴 객체의 결합을 통해 기능을 동적으로 유연하게 확장할 수 있게 해주는 패턴 (기능 확장) 구성 Component ConcreteComponent와 Decorator가 구현할 인터페이스 기본 기능을 뜻하는 ConcreteComponent와 추가 기능을 뜻하는 Decorator의 공통 기능을 정의 클라이언트는 Component를 통해 실제 객체를 사용함 public interface Display { void draw(); } ConcreteComponent 기본 기능을 구현하는 클래스 public class RoadDisplay implements Display { @Override public void draw() { System.out.println("Road Display"); // 기..
다이내믹프록시 프록시 팩토리에 의해 런타임에 프록시가 생성된다. 리플랙션을 사용하기 때문에 인터페이스를 직접 구현할 필요 없음. InvocationHandler를 사용해서 중복이 발생하는 것을 해결해준다. 생성 newProxyInstance 메소드 사용 Hello proxiedHello = (Hello) Proxy.newProxyInstance(getClass().getClassLoader(), new Class[]{ Hello.class }, new UppercaseHandler(new HelloTarget())); // 인터페이스, InvocationHandler 구현체 InvocationHandler invoke() 메소드 하나만 가지고 있는 인터페이스 프록시의 메소드가 호출됐을 때 invoke()..
트랜잭션 속성 트랜잭션 전파 : 트랜잭션의 경계에서 이미 진행 중인 트랜잭션이 있을 때 또는 없을 때 어떻게 동작할지 결정하는 방식 PROPAGATION_REQUIRED : 진행 중인 트랜잭션이 없으면 새로 시작하고, 이미 시작된 트랜잭션이 있으면 이에 참여한다. PROPAGATION_REQUIRES_NEW : 항상 새로은 트랜잭션을 만들어서 독자적으로 동작. PROPAGATION_NOT_SUPPORTED : 트랜잭션 없이 동작. (특별한 메소드만 트랜잭션 적용에서 제외할 때) 격리수준 : 특정 트랜잭션이 다른 트랜잭션에서 변경한 데이터를 볼 수 있도록 허용할지 말지를 결정하는 것. 제한시간 읽기전용 : 트랜잭션 내에서 데이터를 조작하는 시도를 막아줄 수 있다. 메소드별로 다른 트랜잭션 정의를 적용하려면..
ProxyFactoryBean 프록시를 생성해서 빈 오브젝트로 등록하게 해주는 팩토리 빈 순수하게 프록시를 생성하는 작업만을 담당 부가기능은 MethodInterceptor 인터페이스를 구현해서 만든다. (타깃 오브젝트에 대한 정보도 제공받는다.) 새로운 부가기능을 추가할 때마다 프록시와 프록시 팩토리 빈을 추가하지 않아도 된다. 독립적이고, 여러 프록시가 공유할 수 있는 어드바이스와 포인트컷으로 확장 기능을 분리할 수 있다. @Test public void proxyFactoryBean(){ // 인터페이스 타입 전달할 필요 없음. ProxyFactoryBean pfBean = new ProxyFactoryBean(); pfBean.setTarget(new HelloTarget()); pfBean.ad..
프록시 패턴 이용해서 트랜잭션 코드 분리하기 DI 적용해서 비즈니스 로직과 트랜잭션 코드 분리 Client(UserServiceTest) -> UserServiceTx(프록시 / 트랜잭션 처리 로직) -> UserServiceImpl(타킷 / 비즈니스 로직) UserServiceTx에서 트랜잭션 경계설정 작업을 하고 실제 비즈니스 로직은 UserServiceImpl에서 담당 핵심 기능 코드와 부가기능 코드 분리, 부가기능을 통해 핵심기능 이용 프록시 패턴 클라이언트에게 실제 타깃 오브젝트 대신 프록시를 넘겨주는 것. 프록시 : 자신이 클라이언트가 사용하려고 하는 실제 대상인 것처럼 위장해서 클라이언트의 요청을 받아주는 것 클라이언트가 프록시의 메소드를 통해 타깃을 사용하려고 하면 프록시가 타깃 오브젝트를..
트랜잭션 더 이상 나눌 수 없는 작업단위 중간에 예외가 발생해서 작업을 완료할 수 없다면 아예 작업이 시작되지 않은 것처럼 초기 상태로 돌려놔야한다 트랜잭션 롤백 : 한 트랜잭션에서 모든 sql문이 성공적으로 수행되기 전에 문제가 발생할 경우 앞에서 처리한 sql 작업도 취소해야한다. 트랜잭션 커밋 : 한 트랜잭션에서 모든 sql 작업이 다 성공적으로 마무리외었을 때 db에 알려줘서 작업 확정 // 트랜잭션 경계설정 Connection c = dataSource.getConnection(); c.setAutoCommit(false); // 트랜잭션 시작 try{ // 쿼리 c.commit(); // 트랜잭션 시작 } catch(Exception e){ c.rollback(); // 트랜잭션 롤백 } 데이..
jdbcTemplate 사용하면 throws SQLException 선언 사라짐 예외 처리할 때 주의할 것 Exception을 catch하면 꼭 처리를 해야한다. 넘어가면 안된다. System.println으로 콘솔에 출력하면 메세지를 놓치기 쉽다. 모든 예외는 적절하게 복구되든지 아니면 작업을 중단시키고 분명하게 통보돼야한다. 모든 예외를throws Exception으로 처리하면 의미있는 정보를 얻을 수 없다. 예외의 종류와 특징 Error(java.lang.Error) 시스템에 뭔가 비정상적인 상황이 발생했을 때 주로 자바 VM에서 발생. 애플리케이션 코드에서 잡으려고 해도 대응 방법이 없다. ex) OutOfMemoryError, ThreadDeath Exception과 체크예외(java.lang...
템플릿 : 바뀌는 성질이 다른 코드 중에서 다른 코드 중에서 변경이 거의 일어나지 않으며 일정한 패턴으로 유지되는 특성을 가진 부분을 자유롭게 변경되는 성질을 가진 부분으로부터 독립시켜서 효과적으로 활용할 수 있도록 하는 방법 JDBC 코드는 try catch finally 문으로 인해 복잡해진다. 이를 더 좋은 구조로 한번 만들어 보자. 템플릿 메소드 패턴으로 수정하기 템플릿 메소드 패턴 : 상속을 통해 기능을 확장해서 사용하는 부분이다. 변하지 않는 부분은 슈퍼클래스에 두고, 변하는 부분은 추상 메소드로 정의한 뒤 서브 클래스에서 오버라이드한다. Dao 로직마다 상속을 통해 새로운 클래스를 만들어야한다. / 확장 구조가 고정된다. // 추상클래스 extends public class UserDaoDe..
- Total
- Today
- Yesterday
- c#
- DataAnnotation
- 자바의 정석
- MSSQL
- spring boot
- JPA
- JpaRepository
- Effective Java
- 토비의 스프링
- 스프링
- 준영속
- @Modifying
- 스프링 부트 테스트
- Java
- SpringBoot
- default interface
- C# 문법
- orphanRemoval
- Spring
- 영속성
- 스프링MVC
- uploadfive
- OWIN
- JavaScript
- 빌더 패턴
- jQuery
- ASP.NET
- 고아 객체
- 다이내믹 프록시
- Nullable
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |