본문 바로가기

전체 글

토비의 스프링 - 6.1 트랜젝션 코드의 분리 6.1.1 AOP(Aspect Oriented Programming) AOP는 IoC/DI, 서비스 추상화와 더불어 스프링의 3대 기반기술임 AOP는 스프링의 기술 중에서 가장 난해한 용어와 개념을 가진 기술임 AOP는 주로 선언적 트랜잭션 기능에 많이 사용됨 서비스 추상화를 통해 근본적 문제를 해결 했지만, AOP로 더욱 세련되고 깔끔한 방식으로 바꿀 수 있음 AOP 등장 배경, 스프링이 AOP를 도입한 이유, AOP 적용의 장점 등을 공부할 것임 6.1.2 메소드 분리 서비스 추상화 기법을 통해 트랜잭션의 근본적 문제를 해결했지만 UserService에는 트랜잭션 로직과 비즈니스 로직이 같이 존재함 스프링이 제공하는 트랜잭션 인터페이스 PlatformTransactionManager를 사용했지만, 메.. 더보기
프로그래머스 - 숫자 게임(Java) 힙(Heap) 구조를 이용한 구현 문제입니다. 이 문제를 풀기 위해서는 한 가지의 아이디어가 필요합니다. 'A의 큰 숫자를 B의 큰 숫자로 대응시켜야 한다.' A에는 {5, 1, 3, 7}가 있고, B에는 {1, 1, 6, 8}이 있다고 가정하겠습니다. A의 {5}는 B의 {6}과 {8}로 해결할 수 있습니다. B의 {8}로 A의 {5}를 이기게 되면, B의 {6}은 {3}을 이겨 최대가 2가 됩니다. 하지만, B이 {8} A의 {7}을 이기면 최대가 3이 됩니다. 배열을 정렬하게 된다면 일반적으로 O(nlogn)의 시간이 걸리게 됩니다. 하지만, 단순히 힙 구조에 넣게 되면 배열 정렬하면서 O(N)의 시간으로 정렬된 값들을 얻을 수 있습니다. 단, 이 문제의 특성상 거의 모든 원소의 값을 크기 순으로 .. 더보기
토비의 스프링 - 5.5 5장 정리 5.5.1 정리 비즈니스 로직과 데이터 액세스 로직은 분리되어야 함. 또한, 비즈니스 로직 내부에서도 책임과 역할에 따라 메소드로 분리되야 함 인터페이스와 DI를 이용하여 결합도를 낮춰야 함 DAO를 사용하는 비즈니스 로직에는 트랜잭션이 필요함 트랜잭션의 시작과 종료를 지정하는 일을 트랜잭션 경계설정이라 함. 주로 경계설정은 비즈니스 로직에서 많이 발생됨 트랜잭션 정보를 담은 DAO에 전달하는 방법은 매우 비효율적이기 때문에, 스프링이 제공하는 트랜잭션 동기화 방법을 사용하는 것이 편리함 자바에서 사용되는 트랜잭션 API의 종류와 방법은 많음. 트랜잭션 방법이 변경되면 경계설정 코드도 변경돼야 함 트랜잭션 경계설정 코드가 비즈니스 로직 코드에 영향을 주지 않기 위해 스프링이 제공하는 트랜잭션 서비스 추상.. 더보기
토비의 스프링 - 5.4 메일 서비스 추상화 5.4.1 JavaMail을 이용한 메일 발송 기능 새로운 요구사항 등장 레벨 업그레이드된 유저에게 안내 메일을 보내는 기능 추가 DB에 email 필드 추가 UserDao의 userMapper, insert(), update()에 emial 필드 처리 추가 테스트 데이터를 맞게 준비 및 등록, 수정, 조회에서 테스트 코드 수정 💡 앞으로 할 부분에 email 부분을 굳이 필요로 하지 않기 때문에 추가 안할것임 5.4.2 JavaMail 발송 JavaMail을 이용해 메일을 발송하는 전형적인 코드 단순한 예제이므로 한글 인코딩 부분 생략 SMTP 프로토콜을 지원하는 메일 전송 서버가 준비 되었다면 정상적으로 실행될 것임 public class UserService { ... protected void u.. 더보기
프로그래머스 - 이중우선순위큐(Java) 우선순위큐(PriorityQueue) 문제입니다 우선순위큐를 두 번 사용하면 해결할 수 있습니다. 첫 번째 우선순위큐에 값들을 저장시키고, 최소값을 빼내는데 사용합니다.(Java는 최소힙이기 때문에 첫 번째 값을 바로 빼낼 수 있습니다.) 두 번째 우선순위큐는 최소 값을 빼내기 위해 사용합니다. 첫 번째 우선순위큐의 원소들을 차례로 하나씩 빼 두 번째에 저장시켜 최대가 아닌 원소를 저장합니다. 첫 번째 우선순위큐의 최대가 제거되었으면 두 번째 우선순위 큐에 옮겨놓은 원소들을 다시 이동시키면 됩니다. [구현 코드] import java.util.*; class Solution { public static int[] solution(String[] operations) { PriorityQueue pq = .. 더보기
토비의 스프링 - 5.3 서비스 추상화와 단일 책임 원칙 5.3.1 수직, 수평 계층구조와 의존관계 추상화 기법을 이용하면 특정 기술환경에 종속되지 않는 포터블한 코드를 만들 수 있음 UserDao는 데이터 액세스 로직임 UserService는 사용자 관리 업무의 비즈니스 로직임 UserDao와 UserService 분리는 같은 애플리케이션 계층에서의 수평적 분리임 UserDao와 UserService는 인터페이스와 DI를 통해 연결됨으로써 낮은 결합도를 지님 즉, 독립적으로 확장 가능 마찬가지로 UserService와 트랜잭션 기술은 PlatformTransactionManager 인터페이스를 사용했기 때문에 독립적인 코드임 단, UserService와 PlatformTransactionManager는 로우 계층의 수직적 분리임 하지만, DI를 통한 수평적,.. 더보기
토비의 스프링 - 5.2 트랜잭션 서비스 추상화 5.2.1 모 아니면 도 레벨 업그레이드 도중 문제가 발생하면 이전에 업그레이드 된 것은 초기화 되는가? 일부 사용자가 차별성을 느끼기 때문에 업그레이드 도중 실패 시, 초기화 하는게 옳음 짧은 업그레이드 시간 중간에 DB 서버를 다운시키거나 네트워크에 장애 발생하는 것은 불가능 하며, 테스트는 자동화되야 하므로 예외가 발생하는 상황을 의도적으로 만들 것임 예외를 강제로 발생시킬 때 애플리케이션 코드를 수정하는 것은 좋지 않음 기존의 UserService 내부에 UserService를 상속한 테스트용 확장 static 클래스를 만들어 사용 현재 두 번째와 네 번째 사용자가 레벨 업그레이드 되므로, 네 번째 사용자 처리하는 중에 예외 발생할 것임 upgradeLevel() 메소드 오버라이드를 통해 네 번째.. 더보기
백준 - 10282 해킹(Java) https://www.acmicpc.net/problem/10282 10282번: 해킹 최흉최악의 해커 yum3이 네트워크 시설의 한 컴퓨터를 해킹했다! 이제 서로에 의존하는 컴퓨터들은 점차 하나둘 전염되기 시작한다. 어떤 컴퓨터 a가 다른 컴퓨터 b에 의존한다면, b가 감염되면 www.acmicpc.net 다익스트라 문제입니다. 의존성이 주어질 때, 해킹당한 컴퓨터가 몇대의 컴퓨터를 감염 시키는지와 그에 걸리는 시간을 구하는 문제입니다. 각 테스트 케이스마다 시작점이 주어지고, (최소)시간을 구해야 하기 때문에 다익스트라라는 것을 알 수 있습니다. 다익스트라의 시간 복잡도는 O(VlogV + ElogV)입니다. 문제에서 최대 V의 개수는 10,000입니다. 또, 최대 E의 개수는 100,000입니다. .. 더보기