본문 바로가기

전체 글

프로그래머스 - N으로 표현(Java) DP 문제입니다. 1~9까지의 숫자 N이 주어졌을 때, 해당 숫자를 8개 미만으로만 사용하여 number의 값을 구하는 문제입니다. 우선 덧셈 공식을 먼저 생각을 해야하는 문제입니다. 그림과 같이 2 이상의 수는 두 자리의 덧셈으로 나타낼 수 있습니다. 이것을 단순히 덧셈이 아니라 경우의 수로 바꿔서 생각해야 합니다. N이 4가 주어진다고 가정하겠습니다. 주어진 4를 1개 사용하면 {4}입니다. 2개 사용하면 {44, 4+4, 4-4, 4*4, 4/4} = {44, 8, 0, 16, 1}입니다. 즉, 1개를 사용한 것에서 사칙연산 및 이어 붙이기를 한 것이 됩니다. 3개를 사용하면 {444, 4+4+4, 4+4-4, (4+4)*4, (4+4)/4, 4-4+4, 4-4-4, ...}입니다. 즉, 2개를 사.. 더보기
Exception in thread "main" java.util.ConcurrentModificationException Collection의 값을 반복문 내부에서 수정할 때 발생되는 예외이다. Collection의 값을 수정할 때, 삭제하는 경우 그 크기를 줄여야 한다. 하지만, 아래 코드는 삭제가 아닌 추가만 하고 있다. for(int i=2; i 더보기
토비의 스프링 - 6.9 6장 정리 6.9.1 정리 트랜잭션 경계설정 코드를 분리해서 별도의 클래스로 만들고, 비즈니스 로직 클래스와 동일한 인터페이스를 구현하면 DI의 확장 기능을 이용해 트랜잭션 부가기능을 만들 수 있음 트랜잭션처럼 환경과 외부 리소스에 영향을 받는 코드를 분리하면 비즈니스 로직에만 충실한 테스트를 만들 수 있음 목 오브젝트를 이용하면 쉽게 고립된 테스트를 만들 수 있음 DI를 이용한 트랜잭션 분리는 데코레이터 패턴과 프록시 패턴으로 이해될 수 있음 번거로운 프록시 클래스 작성은 JDK 다이내믹 프록시를 이용하면 간단히 만들 수 있음 다이내믹 프록시는 스태틱 팩토리 메소드를 사용하기 때문에 빈 등록하기 번거로움. 팩토리 빈을 사용하면 되고, 스프링은 자동 프록시 생성 기술에 대한 추상화 서비스를 제공하는 프록시 팩토리 .. 더보기
토비의 스프링 - 6.8 트랜잭션 지원 테스트 6.8.1 선언적 트랜잭션과 트랜잭션 전파 속성 REQUIRED로 전파 속성을 설정하면 앞에서 트랜잭션이 진행되고 있으면 새로운 트랜잭션을 시작하지 않고, 기존의 트랜잭션에 참여를 함 REQUIRED 전파 속성을 가진 메소드를 결합해 다양한 크기의 트랜잭션 작업을 만들 수 있음 A 메소드에서 B 메소드를 호출하는데, A와 B 작업이 모두 완료되어야만할 때, REQUIRED 전파 속성을 사용해야 함 AOP를 이용해 코드 외부에서 트랜잭션 기능을 부여해주는 방법을 선언적 트랜잭션(Declarative Transaction)이라 함 대조적으로, TransactionTemplate나 개별 데이터 트랜잭션 API를 사용해 직접 코드 안에서 사용하는 방법을 프로그램에 의한 트랜잭션(Programmatic Trans.. 더보기
토비의 스프링 - 6.7 애노테이션 트랜잭션 속성과 포인트컷 6.7.1 트랜잭션 애노테이션 포인트컷과 트랜잭션 속성을 이용해 트랜잭션을 일괄적으로 적용하는 방식은 대부분 상황에서 잘 들어맞음 하지만, 세밀하게 튜닝된 트랜잭션 속성의 경우 포인트컷과 트랜잭션 속성 사용으로는 적합하지 않음 포인트컷과 트랜잭션 속성과 같이 설정 파일에서 분류 가능한 그룹으로 만들어 일괄적으로 속성을 부여하는 대신, 직접 타킷에 속성정보를 가진 애노테이션을 지정해 세밀하게 트랜잭션 속성을 적용함 이 애노테이션을 트랜잭션 애노테이션이라 함 @Transaction 애노테이션을 정의한 코드 @Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented public .. 더보기
토비의 스프링 - 6.6 트랜잭션 속성 6.6.1 트랜잭션 속성 트랜잭션 추상화를 할 때 그냥 넘어간 것이 한 가지 있음 트랜잭션 속성을 담당하는 DefaultTransactionDefinition 오브젝트임 트랜잭션 경계는 트랜잭션 매니저에서 트랜잭션을 가져오는 것과 commit(), rollback() 중 하나를 호출하는 것으로 설정됨 public Object invoke(MethodInvocation invocation) throws Throwable { TransactionStatus status = this.transactionManager.getTransaction( new DefaultTransactionDefinition()); try{ Object ret = invocation.proceed(); this.transaction.. 더보기
토비의 스프링 - 6.5 스프링의 AOP 6.5.1 프록시 생성의 문제 부가기능이 타깃 오브젝트마다 새로 만들어지는 문제는 ProxyFactoryBean의 어드바이스를 통해 해결 되었음 남은 문제는 부가기능의 적용이 필요한 타깃 오브젝트마다 비슷한 내용의 ProxyFactoryBean 빈 설정정보(XML)를 추가해야하는 부분임 빈 후처리기를 사용하면 설정정보를 자동으로 추가할 수 있음 6.5.2 빈 후처리기를 이용한 자동 프록시 생성기 스프링은 컨테이너로서 제공하는 기능 중에서 변하지 않는 핵심적인 부분외에 대부분 확장할 수 있도록 확장 포인트를 제공하고 있음 관심을 가질만한 확장 포인트는 BeanPostProcessor 인터페이스를 구현해서 만드는 빈 후처리기임 스프링은 빈 후 처리기가 빈으로 등록되어 있으면 빈 오브젝트가 생성될 때 마다 빈.. 더보기
프로그래머스 - 타겟 넘버(Java) dfs 문제입니다. dfs를 통해 모든 경우의 수. 즉, 완전 탐색을 하면서 조건에 맞는 것을 찾으면 됩니다, [구현 코드] class Solution { private static int cnt = 0; public static int solution(int[] numbers, int target) { dfs(0, numbers, target, 0); return cnt; } private static void dfs(int number, int[] numbers, int target, int depth) { if (depth == numbers.length) { if (number == target) { cnt++; } return; } // +일 때 dfs(number+numbers[depth], .. 더보기