본문 바로가기

전체 글

토비의 스프링 - 7.3 서비스 추상화 적용 7.3.1 JaxbXmlSqlReader 개선 과제 JaxbXmlSqlReader를 개선할 두 가지 과제를 생각할 수 있음 JAXB 이외의 XML과 자바 오브젝트 매핑 기술 XML 파일을 다양한 소스에서 가져오게 함 💡 클래스 패스, 파일 시스템, 웹 등 다양한 위치에서 가져오게 함 7.3.2 OXM 서비스 추상화 OXM(Object-XML Mapping)은 XML 과 자바 오브젝트를 매핑해서 상호 변환하는 기술임 자바에는 JAXB 외에 자주 사용되는 XML과 자바 오브젝트 매핑 기술이 존재함 Castor XML 설정파일이 필요없는 인트로스펙션 모드를 지원하기도 하는 간결하고 가벼운 바인딩 프레임워크 JiBX 뛰어난 퍼포먼스를 자랑하는 XML 바인딩 기술 XmlBeans 아파치 XML 프로젝트의 하나. .. 더보기
토비의 스프링 - 7.2 인터페이스의 분리와 자기참조 빈 7.2.1 JAXB(Java Architecture for XML Binding) XML에 담긴 정보를 파일에 읽어오는 방법 중 하나 JAXB는 DOM과 과 같은 전통적인 XML API와 비교했을 때, XML 문서정보를 거의 동일한 구조의 오브젝트로 직접 매칭해줌 DOM은 XML 정보를 마치 자바의 리플렉션 API를 사용해 조작 하는것 처럼 간접적으로 접근해야 함 JAXB는 XML의 정보를 그대로 담고 있는오브젝트 트리를 만들어주기 때문에, XML 정보를 오브젝트 처럼 직접적으로 다룰 수 있어 편리함 JAXB는 XML 문서의 구조를 정의한 스키마를 이용해서 매핑할 오브젝트의 클래스를 자동으로 만들어주는 컴파일러도 제공함 스키마 컴파일러를 통해 자동생성 된 오브젝트에는 매핑정보가 애노테이션으로 담겨 있음 .. 더보기
토비의 스프링 - 7.1 SQL과 DAO의 분리 7.1.1 XML 설정을 이용한 SQL과 DAO의 분리 비즈니스 로직을 Service에서 책임을 갖게 하고, 데이터 액세스 로직을 DAO에서 책임을 갖도록 했음 데이터를 가져오고 추가하는 작업의 인터페이스 역할을 하는 것이 DAO임 데이터 액세스 기술 및 오브젝트 등이 변경 되더라도 DAO는 변경되지 않음 하지만, DAO에서 DB의 테이블, 필드 이름과 같은 SQL 문장이 바뀔수 있음 필드 추가와 같은 SQL 변경이 필요한 상황에는 DAO 코드는 수정될 수 밖에 없음 때문에, SQL과 DAO를 분리해야 함 SQL을 스프링의 XML 설정 파일로 빼고, String으로 빈의 값을 주입 SQL은 String으로 빈의 값이 주입되어 있으므로, 프토퍼티 값으로 정의해 DAO에 주입 가능 7.1.2 개별 SQL 프.. 더보기
프로그래머스 - 부대복귀(Java) 다익스트라(dijkstra) 문제입니다. 연결 정보가 주어지고, 여러 출발지에서 하나의 목적지 까지로 가는 가중치를 구하는 문제입니다. 무방향 그래프이기 때문에 이를 반대로 생각하면, 하나의 목적지에서 여러 출발지까지 가는 가중치를 구하는 문제로 해석할 수 있습니다. 즉, 하나의 시점에서 다른 노드들로 가는 최소 가중치를 구하는 문제이므로 다익스트라인 것을 알 수 있습니다. 다익스트라 시간 복잡도는 O(VlogV + ElogV)입니다. log500,000의 값이 18.931568569324174이므로, 19로 계산하겠습니다. 500,000*19 + 100,000*19 = 11,400,000 입니다. 이정도면 허용범위 내라고 할 수 있기 때문에, 다익스트라 시간복잡도로 해결할 수 있습니다. [구현 코드] .. 더보기
프로그래머스 - 순위(Java) 플로이드-와샬(Floyd-Warshall) 문제입니다. 플로이드 와샬은 모든 노드가 다른 노드로 갈 때의 가중치를 이차원 배열 형태로 저장하는 알고리즘입니다. 선수 n명과 대진표 일부가 주어졌을 때, 순위를 알 수 있는 선수의 수를 구하는 문제입니다. 플로이드 와샬은 기본적으로 돌아갈 경우가 더 짧으면 돌아가는 형태를 지닙니다. // k를 거쳐서 가는 경우 for (int k = 1; k dis[i][k] + dis[k][j]){ ... } } } } 이 말을 다르게 해석하면, 가중치가 갱신이 될 경우에는 연결된다라는 의미이기도 .. 더보기
프로그래머스 - 가장 긴 팰린드롬 구현 문제입니다. 가장 긴 부분 문자열 부터 시작하여 모든 부분 문자열을 확인해 팰린드롬을 찾으면 됩니다. 처음에 두 개의 반복문 안에 subString으로 문자열을 짜르고 비교하는 코드를 사용했었습니다. String le = str1.subString(0, di); String ri = str1.subString(di+1, n); StringBuilder sb = new StringBuilder(ri); if(le.equals(sb.reverse().toString())){ ... } 예시 코드가 길어지기 때문에 생략했지만, 최소 subString이 네 개는 필요했습니다. subString의 경우 O(N)의 시간이 소요되기 때문에 시간초과가 발생했습니다. 이후 방법은 subString이 아닌 반복문을 .. 더보기
프로그래머스 - 여행경로(Java) dfs 문제입니다. 주어지는 항공권을 모두 사용해서 여행 경로를 만들어야 합니다. 저의 경우 항공권이 주어지면 해당 정보를 Map에 저장했습니다. Map에 저장하면 O(1)로 value를 가져올 수 있기 때문에, 반복해서 찾는 것 보다 더 좋다고 생각했습니다. 추가로 항공권 정보를 Map에 저장할 때, 항공권의 위치를 저장했습니다. 중복해서 항공권을 사용하지 않고 여행 경로를 만들기 위함 입니다. [구현 코드] import java.util.*; class Solution { private static boolean[] visited; private static Map map; private static List ansList; private static class Node{ String city; in.. 더보기
프로그래머스 - 디스크 컨트롤러(Java) 힙 문제입니다. 한 번에 하나의 일만 처리할 수 있는 디스크에 여러 요청이 들어왔을 때, 요청 대기시간의 평균을 가장 짧게 만들어야 합니다. 입력 값과, 스케줄 길이에 따라 정렬을 하게 된다면 O(Nlog(N))으로 문제를 해결할 수 있습니다. 특정 시간을 기준으로 해결할 수 있는 있는 요청을 우선순위 큐에 삽입하여 하나씩 처리하면 됩니다. [구현 코드] import java.util.Arrays; import java.util.Comparator; import java.util.PriorityQueue; class Solution { private static class Job implements Comparable { int s, d; public Job(int s, int d) { this.s = .. 더보기