JPA를 쓸때 EntityManager.find()와같은 간단한 함수로 실행할 수 없는 요청은 ... EntityManager em = emf.createEntityManager(); ... // createQuery메소드를 통해서 쿼리를 짤수있다. List result = em.createQuery("select m from Member as m", Member.class).getResultList(); 위와 같이 쿼리를 직접 입력 가능하다. 다만, 데이터베이스 테이블을 대상으로 쿼리를 짜는 SQL과 달리, JPQL은 엔티티 객체를 대상으로 쿼리문을 작성한다. 그러면 jpa가 자동으로 코드를 바꿔서 호출해준다.
설정 JPA 실습을 위해서 실습용 DB를 설치하고, 프로젝트의 pom.xml에 라이브러리를 추가해준다. spring.io사이트에 들어가서 확인해보면 실습을 진행할 스프링부트 2.6.2버전에서는 hibernate 5.6.3.Final을 사용함을 알 수 있다. 여기서 하이버네이트란 JPA의 구현체로, JPA '인터페이스'를 구현한다. JPA는 단순히 hibernate를 추상화한 인터페이스일뿐, JPA자체로만 동작하지 않는다. 따라서 스프링부트와 호환되는 hibernate버전을 의존관계에 추가해주자) //pom.xml 일부 org.hibernate hibernate-core 5.6.3.Final //스프링부트 버전에 맞춘 하이버네이트 버전 ... com.h2database h2 2.0.204 //사용중인 h2..
문제 차세대 영농인 한나는 강원도 고랭지에서 유기농 배추를 재배하기로 하였다. 농약을 쓰지 않고 배추를 재배하려면 배추를 해충으로부터 보호하는 것이 중요하기 때문에, 한나는 해충 방지에 효과적인 배추흰지렁이를 구입하기로 결심한다. 이 지렁이는 배추근처에 서식하며 해충을 잡아 먹음으로써 배추를 보호한다. 특히, 어떤 배추에 배추흰지렁이가 한 마리라도 살고 있으면 이 지렁이는 인접한 다른 배추로 이동할 수 있어, 그 배추들 역시 해충으로부터 보호받을 수 있다. 한 배추의 상하좌우 네 방향에 다른 배추가 위치한 경우에 서로 인접해있는 것이다. 한나가 배추를 재배하는 땅은 고르지 못해서 배추를 군데군데 심어 놓았다. 배추들이 모여있는 곳에는 배추흰지렁이가 한 마리만 있으면 되므로 서로 인접해있는 배추들이 몇 군..
JPA (Java Persistance API) 과거에는 객체를 DB에 저장하기 위하여 Jdbc를 일일히 입력해야 했다. 그 후에 JdpcTemplate이 나오면서 보다 번거로움은 줄었지만 sql은 직접 개발자가 String으로 입력해주어야 하고, 동적쿼리 문제를 해결하는데 어려움을 겪었다. 나 또한 올해 말에 진행했던 앱 프로젝트에서 DB연동을 위해 sql을 일일히 함수에 추가해주고, 계획에 변경이 생길 때마다 관련 sql문과 함수들을 찾아 직접 변경해주며 번거로움을 느낀 경험이 있었다. 하지만 번거롭더라도 관계형 데이터베이스(RDB)를 다루기 위해서는 sql은 필수적이기 때문에 생략할 수 없다. 그래서 CRUD 등의 기능을 구현하기 위해서는 객체를 생성하고 나서 sql문에 의존적인 개발이 진행될 ..
4. Mergesort 병합정렬은 divide and conquer의 방법을 사용하는 분할 정복 알고리즘이다. divide and conquer란 DP에서 설명했듯 큰 문제를 작은 문제들로 나누어 각각을 푸는 것으로, top-down approach의 방식으로 접근한다. divide and conquer의 특성을 이용하는 만큼 재귀호출을 이용한다. //pseudocode mergeSort(left, right) { if(left
정렬 알고리즘 정렬 알고리즘은 n개의 input이 주어졌을 때, 이것들을 특정한 기준을 정해(오름차순, 내림차순) 정렬하여 출력하는 알고리즘이다. 효율적인 정렬은 데이터의 정규화를 통해 정렬된 상태에서 사용 가능한 다른 알고리즘을 수행하기 위해 필요하다. 이러한 정렬 알고리즘은 여러 종류가 있으며, 그 방법에 따라 다양한 수행시간을 가진다. 대부분 O(nlgn)과 O(n^2) 사이의 시간복잡도를 가지지만, input이 특수한 성질을 만족하는 경우에는 O(n) sorting도 가능하다. 1. Selection Sort 범위 내의 최소/최대값을 선택해서 한쪽으로 열외시키는 것 반복 선택정렬은 배열을 한쪽 방향부터 정렬하는 제자리 정렬 알고리즘이다. 제자리 정렬 알고리즘이란 input에 필요한 메모리 외에 추..
피보나치 문제의 예시를 보자. 피보나치의 경우 재귀함수를 이용한 Divide-and-Conquer 방법으로 풀 수도 있지만, 재귀의 방법을 사용하면 모든 호출된 재귀함수들이 fib(1)에서부터 계산해나가야 하기 때문에 수행시간이 길다. //재귀를 사용한 피보나치, Top-down public int fibInRecursive(int n) { if(n=1) { fib[1]=1; for(int i=2; i
탐색 알고리즘 주어진 input에서 원하는 data를 찾기 위한 알고리즘. 1. Sequential search 리스트에서 저장된 데이터를 차례로 검사한다. 무작위로 저장된 리스트를 탐색할 수 있지만, 최악의 경우(리스트에 찾으려는 데이터가 존재하지 않거나, 리스트의 마지막에 데이터가 존재하는 경우) n개의 input size를 갖는 리스트를 탐색할때 O(n)의 시간복잡도를 가진다. public int seqSearch(int[] arr, int target) { for(int i=0; i
문제 어떤 자연수 N은 그보다 작거나 같은 제곱수들의 합으로 나타낼 수 있다. 예를 들어 11=32+12+12(3개 항)이다. 이런 표현방법은 여러 가지가 될 수 있는데, 11의 경우 11=22+22+12+12+12(5개 항)도 가능하다. 이 경우, 수학자 숌크라테스는 “11은 3개 항의 제곱수 합으로 표현할 수 있다.”라고 말한다. 또한 11은 그보다 적은 항의 제곱수 합으로 표현할 수 없으므로, 11을 그 합으로써 표현할 수 있는 제곱수 항의 최소 개수는 3이다. 주어진 자연수 N을 이렇게 제곱수들의 합으로 표현할 때에 그 항의 최소개수를 구하는 프로그램을 작성하시오. 전개 sol. 처음에는 자연수를 큰 수의 제곱부터 더 이상 더할 수 없을때까지 더하면 되겠다고 생각함 재귀함수꼴로 더하는 개수를 co..
0. Analysis of Algorithms 1. Search 1-1. Sequential Search 1-2. Binary Search 1-3. Static Searching - Binary Search Tree 1-4. Dynamic Searching - B-tree 1-5. Hashing 2. Sorting 2-1. Selections Sort 2-2. Bubble Sort, Exchange Sort 2-3. Insertion Sort 2-4. Merge Sort 2-5. QuickSort 2-6. HeapSort 2-7. Counting Sort 2-8. Radix Sort 3. Matrix Multiplication - Strassen's 4. Dynamic Programming 4-1. Bi..
실제 메모리가 얼마나 있던지에 상관없이 프로세서에 일정한 크기의 메모리가 있는 것처럼 환상을 주자! 앞서 Processor와 Main memory의 속도적 한계를 극복하기 위하여 캐시메모리를 사용했다. 캐시메모리에 사용될 확률이 높은 데이터들을 미리 저장해두고 hit이면 빠르게 사용할 수 있게 한 것이다. 이번 Virtual Memory는 메인메모리와 Disk사이의 크기적 한계를 극복하기 위해서 메인메모리를 프로세서와 disk사이의 일종의 '캐시'로 사용하는 것이다. 실제 물리적인 메모리의 크기가 nGB라고 하면 프로그램 하나에서 메모리 전체를 사용하는 경우는 드물기에 필요한 메모리만 사용하게 하는 것이다. VM의 특징 캐시메모리와는 다르게 VM의 경우 miss penalty가 매우 크기 때문에 page..
저번의 Direct Mapped Cache에 이어서 1-2. n-way Set Associative Cache Direct Mapped Cache의 경우 block의 개수가 1개였다. 여러개의 Word를 하나의 index에 저장하는 n-word block방식으로 여러개의 word를 한꺼번에 저장하여 hit rate를 높일 수 있다는 장점이 존재하기는 했지만 index단위로 갱신되는 특성상 같은 index에는 하나의 block만 저장할 수 있었다. 이러한 단점을 해결하기 위해 n-way Set Associative Cache라는 방법이 존재한다. block의 크기를 단순히 늘리는 것이 아니라, 하나의 index에 여러개의 set을 두는 것이다. n-word block 방식과 비슷해 보일수도 있지만 여기서는..