2017의 게시물 표시

(MongoDB) Update

* Update는 인자값이 두개가 아니라 총 4개가 있다. 예) db.test.update( { 조건 } , { 변경값 }, true|false, true|false) 1번인자 : 조건 2번인자 : 변경조건 3번인자 : upsert(upsert란? 있으면 업데이트 없으면 insert하라는 것, 기본값은 false) 4번인자 : 멀티라인 조건여부(기본값 false) * 몽고디비 업데이트시 새로운 필드를 추가하는 경우는 $set을 사용하고, 기존에 있는 필드에 다른 값을 더 추가하고 싶은 경우 $push나 $addToSet를 사용한다. 단, $addToSet은 값을 추가할 때, 중복되지 않도록 확인한다.

(ElasticSearch) 파일을 이용한 데이터 처리

*curl 명령을 이용해 데이터를 입력할 때에는 입력할 데이터의 내용을 -d 뒤에 추가하는 형식으로 입력했다. 이외에도 입력할 데이터의 내용을 미리 파일에 기록한 뒤 다음과 같이 @{파일명}을 지정해 입력할 수 있다. curl -X{메소드} "http://host:port/{인덱스}/{타입}/{도큐먼트id} -d @{파일명}

(ElasticSearch) 데이터 처리

* 삽입 curl -XPUT "http://localhost:9200/books/book/1" -H 'Content-Type:application/json' -d ' {     "title" : "ElasticSearch Guide"    ~~~ } ' 해당 데이터만 보고 싶은 경우는 뒤에 _source를 붙인다. * 조회 curl -XGET http://localhost:9200/books/book/1/_source _source를 붙이지 않은 경우는  메타 정보도 함께 표시된다. * 삭제 curl -XDELETE "http://localhost:9200/books/book/1" 이때는 도큐먼트 데이터를 삭제한 것으로 도큐먼트의 메타정보는 여전히 남아있다. 이후 해당 도큐먼트에 다시 데이터를 업데이트 하면 _version 이 증가 하는 것을 볼 수 있다. 그러나 모든 도큐먼트를 일괄 삭제하면 curl -XDELETE "http://localhost:9200/books/book" 메타 정보도 삭제되는 것을 볼 수 있다. *데이터 업데이트(_update) API 도큐먼트 데이터 업데이트 API는 두 개의 매개변수인 doc와 script를 이용해서 데이터를 제어할 수 있다. doc매개변수는 도큐먼트에 새로운 필드를 추가하거나 기존 필드 값을 변경하는 데 사용한다. script매개변수는 좀 더 복잡한 프로그래밍 기법을 사용해서 입력된 내용에 따라 필드의 값을 변경하는 등의 처리에 사용한다. curl -XPOST http://host:port/{인덱스}/{타입}/{도큐먼트 id}/_update -d '{업데이트 명령어}' 예를들어, 기존의 값에 "Category"필드를 추가하겠다.

(ElasticSearch) 데이터 구조 비교

관계형 DB          엘라스틱서치 데이터베이스      인덱스(Index) 테이블(Table)     타입(Type) 열(Row)          도큐먼트(Document) 행(Column)        필드(Field) 스키마(Schema)  매핑(Mapping) curl -X{메소드} http://host:port/{인덱스}/{타입}/{도큐먼트id} -d '{데이터}'

(ElasticSearch) 엘라스틱서치 환경설정 (Elasticsearch.yml)

* 클러스터 cluster.name : elasticsearch 별도로 설정하지 않으면 클러스터명은 elasticsearch 가 된다. 이름을 변경할 떄 주의할점은 cluster.name 의 콜론 (:) 뒤에 반드시 공백이 있어야 한다. yaml 문법을 사용해서 다음과 같이 설정할 수 있다. cluster :   name : elasticsearch 결과를 확인해보려면 curl -XGET localhost:9200/_cluster/stats?pretty=true 여기서 pretty=true는 결과를 보기 좋게 바꾸어준다. * 게이트웨이  게이트웨이는 엘라스틱서치의 전체 클러스터의 상태를 저장하는 저장소다. 엘라스틱 서치 전체의 클러스터가 종료된 후 재실행 될 때, 게이트웨이에 저장된 상태값을 읽어들여 노드와 인덱스 등에 대해 새로 설정하는데, 이 과정을 리커버리라 한다. * 리커버리 제한 리커버리는 엘라스틱서치의 전체 클러스터가 재실행되거나 노드, 인덱스 등이 추가/삭제될 때 설정된 클러스터의 상태를 유지하기 위해 데이터를 복사하고 재배치하는 활동이다. 설정할 수 있는 항목은 다음과 같다. cluster.routing.allocation.node_initial_primaries_recoveries: -> 이 항목은 클러스터의 재실행 후 처음 리커버리가 실행될 떄 몇개의 샤드 및 복사본을 동시에 재배치하는 작업을 할지 설정한다.

(어노테이션)

@Retention -> 얼마나 오랫동안 어노테이션 정보가 유지되는지 설정할 수 있다. SOURCE  : 어노테이션 정보가 컴파일시 사라짐, 바이트코드에서는 존재하지 않음  예) @Override, @SuppressWarnings CLASS : 클래스 파일에 존재하고 컴파일러에 의해 사용가능, 가상머신 (런타임)에서는 사라짐 RUNTIME : 실행시 어노테이션 정보가 가상머신에 의해서 참조가능, 자바리플렉션에 의해 사용가능 ========================================================= @Target 자신이 만든 어노테이션이 사용되게 될 자바 요소를 지정할수 있다. 예) @Target({ElementType.METHOD}) public @interface MyAnnotation {  String value(); } ========================================================== @Inherited @Inherited 어노테이션은 이 어노테이션을 사용한 슈퍼클래스를 상속한 서브클래스에서도 해당 어노테이션을 갖도록 한다. 예) @Inherited public @Interface MyAnnotation { } @MyAnnotation public class MySuperClass {....} public class MySubClass extends MySuperClass {....} ======================================================= @Documented 이 어노테이션은 지정된 대상의 JavaDoc에 이 어노테이션의 존재를 표기하도록 지정 @Documented public @interface MyAnnotation { }

(Spring) @RequestMapping

@RequestMapping에서 특정 파라미터가 없는 경우에만 인식하도록 하려면 @RequestMapping(value = "/user/edit", params = "!type") -> params는 배열로 선언되어 있으므로 하나 이상 지정 가능하다.

(Ant) Ant 스타일 패턴 정리

<사용되는 의미> ? : 1개의 문자와 매칭 * : 0개이상의 문자와 매칭 ** : 0개 이상의 디렉토리와 파일 매칭 예) "/static/???.jpg ->3개의 문자와 매칭 "/static/* -> 0개 이상의 문자와 매칭 "/static/**" ->즉, static으로 시작하는 디렉토리 파일과 매칭

(SQL) 조인관련 자료

이미지

(하둡) HDFS의 개념

1. 블록 물리적인 디스크에는 블록크기란 개념이있다. 블록 크기는 한번에 읽고 쓸 수 있는 데이터의 최대량이다. 단일 디스크를 위한 파일시스템은 디스크 블록 크기의 정배수인 파일시스템 블록 단위로 데이터를 다룬다. 파일시스템의 블록크기는 보통 수 킬로바이트이고, 디스크 블록크기는 기본적으로 512바이트이다. 사용자는 파일크기에 관계없이 파일을 읽고 쓸 수 있으며, 특정 파일 시스템에 구애받지도 않는다. HDFS도 기본적으로 블록개념을 가지고 있다. 그러나 HDFS블록은 기본적으로 128MB와 같이 굉장히 큰 단위이다. HDFS의 파일은 단일 디스크를 위한 파일시스템처럼 특정 블록 크기의 청크(chunk)로 쪼개지고 각 청크는 독립적으로 저장된다. 단일 디스크를 위한 파일시스템은 디스크 블록 크기보다 작은 데이터라도 한 블록 전체를 점유하지만, HDFS파일은 블록크기보다 작은 데이터일 경우 전체 블록크기에 해당하는 하위 디스크를 점유하지 않는다. 예를들어, HDFS의 블록크기가 128MB고 1MB 크기의 파일을 저장한다면 128MB의 디스크를 사용하는 것이아니라 1MB크기만 사용한다. 분산파일 시스템에서 블록 추상화의 개념을 도입하면서 얻게 된 몇몇 이득이 있다. 첫번쨰 이득은 파일하나의 크기가 단일디스크 용량보다 더 커질수 있다는 것이다. 하나의 파일을 구성하는 여러개의 블록들이 동일한 디스크에만 저장될 필요가 없으므로 클러스터에 있는 어떤 디스크에도 저장될 수 있다. 두번째 이득은 파일단위보다 블록 단위로 추상화를 하면 스토리지의 서브 시스템을 단순하게 만들 수 있다는 것이다. 2. 네임노드와 데이터노드 HDFS 클러스터는 마스터-워커 패턴으로 동작하는 두 종류의 노드(마스터인 하나의 네임노드와 여러개의 데이터노드로 구성되어 있다.) 네임노드는 파일시스템의 네임스페이스를 관리한다. 네임노드는 파일시스템 트리와 그 트리에 포함된 모든 파일과 디렉토리에 대한 메타데이터를 유지한다. 이 정보는 네임스페이스 이미지와 에디터

(스프링) JoinPoint의 사용

AOP관련해서 JoinPoint를 파라미터로 전달받을 경우 반드시 첫번째 파라미터로 지정해야 함 (그 외는 예외 발생) JoinPoint 인터페이스는 호출되는 대상 객체, 메소드 그리고 전달되는 파라미터 목록에 접근할 수 있는 메소드를 제공 Signature getSignature() - 호출되는 메소드에 대한 정보를 구함 Object getTarget() - 대상 객체를 구함 Object[] getArgs() - 파라미터 목록을 구함 org.aspectj.lang.Signature 인터페이스는 호출되는 메소드와 관련된 정보를 제공하기 위해 다음과 같은 메소드를 정의 1. String getName() - 메소드의 이름을 구함 2. String toLongname() - 메소드를 완전하게 표현한 문장을 구함(메소드의 리턴타입, 파라미터 타입 모두 표시) 3. String toShortname() - 메소드를 축약해서 표현한 문장을 구함(메소드의 이름만 구함)

(스칼라) 함수

* 왜 함수형 언어인가? 함수형 프로그래밍인 스칼라에서는 함수 자체를 전달하고 반환받을 수 있습니다. 자바에서의 함수는 함수 객체가 아니라 클래스에 속한 메소드입니다. 스칼라에서 함수는 필요하다면 언제든지 => 로 표현되는 식을 통해 객체처럼 행동할 수 있습니다. 스칼라의 정의는 scalable에서 왓으며 확장이 쉽다는 이야기이다 즉, 잘 사용한다면 아주 동시성이 강한 언어이다. 1. 함수 정의 def 함수명 ([매개변수]): [반환자료형] {   //구현할 로직 } 스칼라에서는 반환값이 없을 때 생략이 가능하다. object class Ex_5_1 {   def main(args:Array[String]) = {     println("반환받은 값 : " + name());   }   def name() = {     var a = 10    a   } } 위의 def함수는 반환형을 명시적으로 쓰지 않아도 반환합니다. 명시적으로 반환형을 명시 할 수 있습니다. def name() : Int = {   val a = 10   return a; } 이렇게하면 Int형이 아닌 다른 자료형을 반환하려 한다면 컴파일 에러가 납니다. <Call-By-Name 함수> 보통 함수는 두 가지 형태로 호출할 수 있습니다. CALL-BY_VALUE (값으로 호출), CALL-BY-NAME(이름으로 호출) CALL-BY-VALUE는 그동안 많이 봐왔던 형식입니다. 예를들어, a(b(x))처럼 중첩된 형태로 함수를 호출하면 안쪽의 함수 b가 반환하는 값이 다시 a에 들어가는 식으로 집어넣어지는 식으로 코드가 동작합니다. CALL-BY-NAME은 b자체가 a의 인수로 들어간다고 생각하면 됩니다. b를 거쳐 나온 값이 아닌, b라는 함수 자체를 매개변수로 인정하는 것입니다. 예) dropship(people(5)) 인 것이 존재할 때, people

(스칼라) 클래스/객체/트레이트

1. 클래스와 객체

(스칼라) 조건문과 반복문

* for 문 for ( x <- 1 to 10) { println(x) } 또는 for ( x <- 1 until 10) { println(x) } to는 10을 포함하고 until은 포함하지 않는다. * 이중포문 for ( x <- 1 until 10; y <- 1 until 10) { println(x) } * 인덱스가 있는 for 문 for( (num, index) <- List.zipWithIndex) { println(num) println(index) } List의 zipWithIndex메소드를 이용해 인덱스를 표현 할 수 있따.

(스칼라) 변수선언

* 변수사용은 아주 간단하다. var a = "변수입니다." val b = " final 변수입니다." 이 두가지가 전부이다. var 은 일반적인 변수이며 변수의 내용이 언제든 바뀔 수 있따. val 은 final 변수이다. 그럼 왜 잘 사용하지 않는 final 을 val을 만들어 가면서까지 만들었을 까요? -> 스칼라는 함수형 언어프로그래밍언어로써 변수 뿐만 아니라 함수까지 집어넣을 수 있다. 그래서 그 안에 담길수 있는 범위가 굉장히 넓다. 범위가 넓다보니 확정지어줘야 하기 때문이다. 또한 스칼라언어는 변수를 초기화 해주어야 한다. 그이유는 컴파일시 어떤 자료형인지 알아야 하기 때문이다. 만약 초기화가 필요없다면 var a = null; 또는 var a = None; 로 설정 해준다. 또한 자료형을 명시적으로 적어 해당 자료형만 넣도록 하는 것이 가능하다. var b : Int = 10 <기본 자료형과 참조자료형> AnyVal -> Byte , Short , Int, Long, Char, Unit, Boolean, AnyRef -> 사용자가 만든 객체, AnyVal이 아닌 객체 * 기본 자료형은 생략 <type 예약어를 이용해 자료형을 별칭화 하기> type 예약어는 자료형이 길고 복잡할 경우 별칭을 주어 쉽게 쓸 수 있습니다. type Name = String type Person = (String, Int) type FType = String => Int// 함수표현식. 첫번째 자료형은 String 두번째 자료형은 (String, Int) 세번쨰는 String 을 받고 Int 를 반환하는 형식입니다. val name: Name = "김말자"; val person: Person = ("김동욱", 24); val f: fType = text =

(스칼라) 모든것은 객체이다.

* 자바는 클래스로 선언되지만, 스칼라는 객체선언으로 시작됩니다. 스칼라에서 객체는 자바로치면 static class 형식으로서 , new 를 통해 인스턴스를 생성하는 것이 아니라 처음부터 단 하나의 인스턴스만 생성가능하느 싱글턴 객체입니다. 싱글턴객체는 여러 인스턴스를 생성하지 못하고, 단 하나의 인스턴스만 생성해야 합니다. * 함수가 다르다. 함수는 def로 정의할 수 있습니다. Unit은 자바의 void 라고 보면된다. 명시적으로 아무것도 반환하지 않음을 나타낸다. 예) object Ex1_1 {   def main(args: Array[String] ): Unit = {   println("핼로 스칼라~"); } }

(스칼라) 스칼라란?

* 스칼라 코드는 짧으며 직관적이다. val otherList = list.filter( i => i>=5); * 스칼라에는 다양한 연산자가 존재한다. 이 연산자들은 모두 하나하나 메소드로 되어있다. 예를들어 , 리스트에는 ++라는 메소드가있따 list1 ++ list2 는 리스트1과 리스트2를 합친결과이다. 이렇게 연산자들이 직관적으로 구현되어있고, 띄어쓰기를 통해 깔끔하게 표현가능하기 때문에 스칼라의 유연성과 가독성은 상당히 높은 수준이다. * 동시성에 강한 언어. 동시성이 뛰어난 라이브러리 아카(akka)가 있따. 아카는 동시성이 뛰어난 액터모델로 이루어져있다. 액터모델이란, 각각의 액터가 서로 간의 메시지를 통해서만 의사소통을 하고 액터를 이루는 변수나 속성은 서로 공유하지 않는 것이다. * 객체지향 + 함수형 언어 스칼라에서는 모든 것이 객체이다. 함수의 매개변수에 함수객체를 집어넣을 수도있고, 변수에 함수를 할당할 수도 있따. Member.members.filter(_userId === 'admin').delete * 맥락을 읽는 언어 자바같은 경우는 자료형 하나하나 명시적으로 지정하고 매개변수를 써야하지만, 스칼라는 필요할 때 implicit 예약어 를 사용하면 명시적인 표현을 감춰버릴 수 있습니다. * 자바와 뛰어난 연계성 자바의 라이브러리를 언제든지 import해서 사용할 수 있습니다. 또한 JVM을 사용합니다.

(Hibernate) 영속성 컨텍스트란?

이미지
1. 엔티티의 생명주기 비영속 : 영속성 컨텍스트와 전혀 관계가 없는 상태 영속 : 영속성 컨텍스트에 저장된 상태 준영속 : 영속성 컨텍스트에 저장되었다가 분리된 상태 삭제 : 삭제된 상태 * 비영속 엔티티 객체를 생성했다. 순수한 객체 상태이며 아직 저장하지 않았다. 따라서 영속성 컨텍스트나 데이터베이스와는 전혀 관련이 없다. 이것을 비영속 상태라한다. 예) Member member = new Member(); member.setId("member1"); member.setUsername("회원1"); * 영속 엔티티매니저를 통해 엔티티를 영속성 컨텍스트에 저장했다. 이렇게 영속성 컨텍스트가 관리하는 엔티티를 영속 상태라 한다. 이제 회원엔티티는 비영속상태에서 영속상태가 되었다. 결국 영속 상태라는 것은 영속성 컨텍스트에 의해 관리된다는 뜻이다. 그리고 em.find()나 JPQL 을 사용해서 조회한 엔티티도 영속성 컨텍스트가 관리하는 영속상태이다. em.persist(member); * 준영속 영속 컨텍스트가 관리하던 영속 상태의 엔티티를 영속성 컨텍스트가 관리하지 않으면 준영속 상태가 된다. em.detach()나 em.close()나 em.clear()를 호출하면된다. em.detach(member); em.remove(member); <영속성 컨텍스트의 특징> 1. 영속성 컨텍스트와 식별자 값 엔티티를 식별자 값(@Id로 테이블의 기본키와 매핑한 값) 으로 구분한다.  따라서 영속상태는 식별자 값이 반드시 있어야 한다. 없으면 예외가 발생한다. 2. 영속성 컨텍스트와 데이터베이스 저장 영속성 컨텍스트에 엔티티를 저장하면 이 엔티티는 언제 데이터베이스에 저장될까? JPA는 보통 트랜잭션을 커밋하는 순간 영속성 컨텍스트에 새로 저장된 엔티티를 데이터베이스에 반영하는데 이것을 플러시(flush)라

(git) 고급 명령어

* git commit --amend : 같은 브랜치 상에 있는 최종 커밋을 취소하고 새로운내용을 추가하거나 설명을 덧붙인 커밋을 할 수 있다. * git revert  : 이전에 작성한 커밋을 지웁니다. 그런데 특정 커밋의 내용을 지우는 새로운 커밋을 만들어 지운 내역을 모든 사람이 알 수 있게 합니다. * git reset : 어떤 커밋을 버리고 이전의 특정 버전으로 다시 되돌릴 때 사용합니다. git revert와 다른 점은 지운 커밋 내역을 남기지 않는 다는 점이다. 참고 : git add 한 내용을 모두 취소하기 위해서는 git checkout .    하면된다. * git checkout HEAD --filename 아직 커밋하지 않은 변경 내역을 취소한다. * git rebase : git merge처럼 병합할 때 사용한다. 하지만 브랜치가 많을 경우 브랜치 이력을 확인하면서 병합한다. * git rebase -i : 서로 다른 두 개의 커밋내역을 합친다.

(성능개선) MongoDB query (when choosing 11 list in each data for just one query)

* 몽고 디비 쿼리작업 db.getCollection('guestbookReply').aggregate([  {"$sort" : {regDt : 1}},  {"$match": {guestbookId : {"$in" :[ObjectId("58f6c9d49a72b291f14afe04"), ObjectId("58fde40e9a72b5cd0c88ae6e"),ObjectId("593fbb103b8baa7d5b6921c7")      ,ObjectId("593fbb663b8bc590ac3f4799")]}}  },  {"$group" : {   "_id":"$guestbookId",   "GuestBookReply":{"$push" : "$$ROOT"}},  },  {"$project" : {      "GuestBookReply" : {"$slice" : ["$GuestBookReply",10]}      }} ]); ====================================================== db.getCollection('guestbookReply').aggregate([ //{"$sort" : {regDt : 1}},  {"$match": {guestbookId : {"$in" :[ObjectId("58f6c9d49a72b291f14afe04"), ObjectId("58fde40e9a72b5cd0c88ae6e"),ObjectId("593fbb103b8baa7d5b6921c7")

(Scala) tratit

* 자바언어의 Interface에 해당하는 녀석이다. 이를 이용해 코드의 재사용을 극대화 할 수 있다. 클래스의 상속관계와는 다르게 여러 trait를 섞어 사용할 수 있다. 여기서 섞어서 사용한다는 것이 중요하다. Java언어의 interface 는 이 interface를 상속받는 클래스들의 뼈대를 제공해 주지만 정작 메소드 구현은 interface를 상속받는 클라이언트 클래스를 구현하는 개발자가 전부 구현해야 한다. 하지만 Scala언어에서의 trait은 이와 다르게 구체적인 함수가 구현되어 있어서 이를 사용하는 개발자는 특별히 mix(섞어서) 함수를 구현하지 않고 바로 사용할 수 있다는 장점이 있다. trait philosophical {  def philosophize() {    println("블라블라")   } } 다른 클래스에서 이 trait을 mix 해서 사용하는 방법은 아래와 같다. class Frog extends philosophical {  override def toString = "Green"; } 여러개의 trait를 사용하는 방법은 다음과 같다. class Frog extends Animal with philosophical with HashLeg {    override def toString = "Green"; } with를 사용하면 된다.

ddd

db.getCollection('guestbookReply').aggregate([  {"$sort" : {regDt : 1}},  {"$match": {guestbookId : {"$in" :[ObjectId("58f6c9d49a72b291f14afe04"), ObjectId("58fde40e9a72b5cd0c88ae6e"),ObjectId("593fbb103b8baa7d5b6921c7")      ,ObjectId("593fbb663b8bc590ac3f4799")]}}  },  {"$group" : {   "_id":"$guestbookId",   "GuestBookReply":{"$push" : "$$ROOT"}},  },  {"$project" : {      "GuestBookReply" : {"$slice" : ["$GuestBookReply",10]}      }} ]);

(Java8) 리듀싱(Reduce)

1. 요소의 합 int sum = numbers.stream().reduce(0, (a, b) -> a + b); int  product = numbers.stream().reduce(1, (a,b) -> a * b); * 초기값 없음 Optional<Integer> sum = numbers.stream().reduce((a, b) -> a+ b); 2. 최댓값과 최솟값 Optional<Integer> max = numbers.stream().max(Integer::max); Optional<Integer> min = numbers.stream().min(Integer::min); Q) 스트림의 요리갯수를 계산하시오. 스트림의 각 요소를 1로 매핑한 다음 reduce로 이들의 합을 계산하는 방식으로 문제를 해결할 수 있다. int count = menu.stream() .map(d -> 1) .reduce(0, (a, b) -> a +b);

(자바8) findFirst와 findAny

* findFirst와 findAny  는 언제 사용하나? 왜 두 메소드가 존재할까? 바로 병렬성 때문이다. 병렬 실행에서는 첫 번째 요소를 찾기 어렵다. 따라서 요소의 반환 순서가 상관없다면 병렬스트림에서는 제약이 적은 findAny를 사용한다.

(Maven) Maven 컴파일러 버전 설정

Maven 의 기본 라이프사이클에서 complie시기에 실행되는 complier 플러그인은 별도 설정이 없을 경우, 자바 1.3버전 기준으로 컴파일할 소스 코드를 파싱하고 자바 1.1 버전에 호환되도록 클래스 파일을 생성한다. 따라서, 제너릭이나 어노테이션과 같이 자바 5이상 버전에서만 유효한 문법이 코드에 포함되어 있을 경우 컴파일 과정에서 문법 에러가 발생하게 된다. <maven-compiler-plugin 설정하기> 메이븐이 기본적으로 사용하는 소스 및 생성 클래스의 자바 버전을 변경하려면 pom.xml파일에서 maven-compiler-plugin의 <configuration> 영역에서 <source> 와 <target> 을 이용해서 소스 코드 및 생성 대상 자바 버전을 지정할 수 있다. 아래코드는 예를 보여준다. <project> <build>  <plugins>   <plugin>    <groupId>org.apache.maven.plugins</groupId>    <artifactId>maven-compiler-plugin</artifactId>    <configuration>     <source>1.8</source>     <target>1.8</target>     <encoding>UTF-8</encoding>   </configuration> </plugin>  </plugins> </build> </project>

(JPA) 엔티티매핑

@Entity 클래스에 @Entity를 붙여주면 JPA가 엔티티로서 관리한다는 것을 의미한다. 속성 name : 다른 Entity와 충돌이 우려될 경우 이름을 붙여준다. 기본적으로 class명을 따른다. 주의사항 기본생성자 필수 final, enum, interface, inner 클래스에 사용못함. 저장필드에 final 필드 사용못함. @Table Entity와 매핑할 DB테이블을 지정한다. 속성 name : 매핑할 table이름, 기본은 Entity 이름을 사용한다. catalog : catalog 기능이 있는 DB에서 catalog를 매핑 schema : schema 기능이 있는 DB에서 schema 를 매핑 uniqueConstraints : DDL 생성 시에 유니크 제약조건을 만든다. <데이터베이스 스키마 자동생성> 자동으로 스키마를 생성하는 기능은 아래 값을 설정 함으로써 가능하다. <property name="hibernate.hbm2ddl.auto" auto="create"> create : 기존 Table Drop + 생성 create-drop : create후 종료시 drop 까지 실행 update : 변경된 내용만 수정한다. 이건 JPA 스팩에는 없고, 하이버네이트에만 있는 설정이다. validate : 기존 DB Table정보와 비교해서 차이가있다면 경고하고 애플리케이션을실행하지 않는다.(하이버네이트에만 있는 설정) none : 설정이 없거나 유효하지 않은 값을 설정하면 기능을 사용하지 않게 된다.

(MongoDB) MongoDB의 $group 사용법

$group 에서 _Id 필드는 유니크 키로 사용되며 distinct값으로 사용된다. _Id 필드는 의무적이다. * $push 는 각 표현의 값을 배열형식으로 집어넣는다.(각각의 키에 해당하는 document에 따라) 예제) sales라는 collection이 주어졌을 때, { "_id" : 1, "item" : "abc", "price" : 10, "quantity" : 2, "date" : ISODate("2014-03-01T08:00:00Z") } { "_id" : 2, "item" : "jkl", "price" : 20, "quantity" : 1, "date" : ISODate("2014-03-01T09:00:00Z") } { "_id" : 3, "item" : "xyz", "price" : 5, "quantity" : 10, "date" : ISODate("2014-03-15T09:00:00Z") } { "_id" : 4, "item" : "xyz", "price" : 5, "quantity" : 20, "date" : ISODate("2014-04-04T11:21:39.736Z") } { "_id" : 5, "item" : "abc", "price" : 10, "quantity" : 10, "date" : ISODate

(MongoDB) MongoDB 의 시스템 변수(System Variables)

System Variables MongoDB offers the following system variables: Variable Description ROOT References the root document, i.e. the top-level document, currently being processed in the aggregation pipeline stage. CURRENT References the start of the field path being processed in the aggregation pipeline stage. Unless documented otherwise, all stages start with  CURRENT  the same as  ROOT . CURRENT  is modifiable. However, since  $<field>  is equivalent to  $$CURRENT.<field> , rebinding  CURRENT  changes the meaning of  $  accesses. DESCEND One of the allowed results of a  $redact  expression. PRUNE One of the allowed results of a  $redact  expression. KEEP One of the allowed results of a  $redact  expression.

AtomicInteger

요약 : 원자적 연산이란, 여러 스레드들이 병렬적으로 수행되어도 안전성을 보장받을 수 있는 것을 의미한다. 이러한 원자적 연산은 하드웨어적으로 접근해야지만 안전성을 보장받는다. 이러한 원자적 연산을 도와줄 수 있는 것이 AtomicInteger가 한 예이다. * 원자적 연산을 수행할 수 있는 유용한 클래스이다. Lock이나 synchronized 키워드 없이도 여러 스레드들에 의해 병렬적으로 수행되어도 결과의 안전성을 보장받을 수 있다면 그 연산은 원자적이라고 한다. 내부적으로 원자적 클래스들은 CAS(compare-and-swap)십분 활용한다. 간단히 설명하자면, 값을 변경할 때 자신이 읽었던 변수의 값을 기억하고 있다가 변경 직전에 변경직전에 변수의 메모리 내의 값을 확인하여 이전에 기억해 놓은 값과 같은 경우에만 처리를 진행하고 그렇지 않은 경우는 무산시키는 방식이다. 이러한 명령은 현대적 CPU에 의해 직접적으로 지원된다.(하드웨어적으로) 그래야 원자적 연산이 가능하다. 하드웨어 지원없이 완벽한 원자적 연산을 지원하는 것이 불가능하다. 따라서 요새는 CPU차원에서(하드웨어 차원에서) 이러한 연산을 지원하므로 특정 변수에 여러 스레드들이 동시에 접근하여 작업하는 경우가 있는 경우 이러한 원자적 연산을 이용하는 클래스를 이용하는 것이 권장된다. 예) AtomicInteger atomInt = new AtomicInteger(0); ExecutorService executor = Executors.newFixedThreadPool(2); IntStream.range(0, 1000) .forEach(i -> executor.submit(atomInt::incrementAndGet)); stop(executor) System.out.println(atomInt.get(0);  ----> 1000 =====> Integer대신 AtomicInteger를 사용했을 뿐이다. Integer는

(포폴)

1. 금칙어 비동기(CompletableFutre ) 7배 차이
1. FileZila

(데이터베이스) 데이터베이스 기본구조

이미지
데이터베이스는 클라이언트, 엔진 파일시스템으로 구성된다. * 데이터베이스 엔진 데이터베이스 엔진은 처리 성능 개선을 위해 동작에 필요한 기초 정보와 파일시스템에 저장된 데이터 중 일부를 메모리에 캐시하고 있어 큰 메모리를 필요로한다. 메모리에 저장되는 데이터 유형은 다음과 같다.

2017년09월 13일 공부해야 할 내용

1. 메인쓰레드실행 및 CountDownLatch 2. @Transaction어노테이션과 예외처리를 잡아주는 Resolver 두 녀석이 공존하는 경우 작동 원리

(네트워크) 쿠키 정리

<쿠키> 쿠키가 사용되는 이유 -> HTTP프로토콜은 connectionless 하고 stateless한다. 통신이 끝나면 상태 정보를 유지 하지 않는다. 상태정보를 유지하지 않기 때문에 게시판이나 메일 확인시 매번 이동할때마다 로그인을 해야 한다. 그래서 쿠키 가 필요하다. 배경 정보 : 쿠키는 웹서버에서 브라우저로 보내는 데이터 문자열. 어떤 브라우저에서 향후 동일한 도메인의 개체를 요청할 경우, 해당 브라우저에서는 동일한 데이터 문자열을 원본 서버에 다시 보낸다. 이 데이터는 "Set-Cookie"라는 HTTP의 헤더 형식으로 웹 서버에 전송된다. 다음은 HTTP 쿠키 트랜잭션이 어떤 형태로 표시되는지에 대한 예입니다. 웹 서버에서 보내는 HTTP 응답: [...] Set−Cookie: first.lastname HTTP GET from the client: [...] Cookie: first.lastname 위 샘플 트랜잭션의 경우, 웹 서버에서는 클라이언트에 "first.lastname"이라는 쿠키를 생성하도록 지시했습니다. 다음번에 이 도메인의 개체를 요청할 때 클라이언트에서는 해당 요청 내에 쿠키를 전송합니다. 이는 웹 서버에서 사용자 로그인 같은 특정 정보를 다시 호출할 수 있는 방법을 보여줍니다. 쿠키의 두 가지 유형: 세션 쿠키 및 영구적 쿠키 쿠키에 만료일이 포함되지 않은 경우 세션 쿠키로 간주합니다. 세션 쿠키는 메모리에 저장되며 디스크에 기록되지 않습니다. 브라우저를 닫는 순간 쿠키는 영구적으로 손실됩니다. 쿠키에 만료일이 포함되어 있으면 영구적 쿠키로 간주합니다. 지정된 만료일이 되면 디스크에서 쿠키가 제거됩니다. 쿠키에는 여러 가지 다른 필드를 세미콜론으로 구분하여 포함할 수 있습니다. 정의는 다음과 같습니다. expires:

(JSON) ObjectMapper 및 각종 JSON 사용예

ObjectMapper mapper = new ObjectMapper(); String ACCESS_TOKEN = "sadasda"; List<BanWordRequest> banwordRequests = new ArrayList<>(); banwordRequests.add(temp1); banwordRequests.add(temp2); //리스트 형 자료를 JSON 문자열로 변환. (리스트가 될 수도 있고 그냥 도메인 클래스여도 상관 없음.) String body = mapper.writeValueAsString(banwordRequests); //헤더 생성 HashMap headers = new HashMap(); headers.put(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE); //파라미터 추가 JSONObject jsonObject = new JSONObject(); jsonObject.add("access_token", ACCESS_TOKEN); //리퀘스트 생성 //URI 생성 URI expanded = new UriTemplate(resourceUrl); String resourceUrl = URLDecoder.decode(expanded.toString(), "UTF-8");

(트러블 슈팅) 메이븐 라이브러리 의존성 문제

(상황) 로컬에서 잘 작동되던것이 배포 후 라이브러리가 없다는 문제가 발생한 상황 <dependency>             <groupId>com.google.api-client</groupId>             <artifactId>google-api-client</artifactId>             <version>1.20.0</version>  </dependency>         <dependency>             <groupId>com.google.guava</groupId>             <artifactId>guava</artifactId>             <version>18.0</version>         </dependency> 구글 api-client가 등록되어 있고 guava도 포함되어있을 떄 충돌 api가 guava를 포함         <dependency>             <groupId>com.google.api-client</groupId>             <artifactId>google-api-client</artifactId>             <version>1.20.0</version>             <exclusions>                 <exclusion>                     <groupId>com.google.guava</groupId>                     <artifactId>guava-jdk5</artifactId>                 &

(Jackson) JSON 변환 주소

http://noritersand.tistory.com/240 http://wiki.fasterxml.com/JacksonInFiveMinutes https://stackoverflow.com/questions/4783421/how-can-i-include-raw-json-in-an-object-using-jackson https://avaldes.com/json-tutorial-jackson-annotations-part-2/#json_raw_value

(Maven) 메이븐 라이프사이클(Lifecycle)과 플러그인 실행

Maven은 clean,  build(default), site의 세 가지 라이프사이클을 제공하고 있다. 각 라이프 사이클은 순서를 갖는 단계(phase)로 구성된다. 또한, 각 단계별로 기본적으로 실행되는 플러그인 골이 정의되어 있어서 각 단계마다 알맞은 작업이 실행 된다. [디폴트 라이프사이클의 주요 단계] 1. generate-sources : 컴파일 과정에서 포함될 소스를 생성한다. 예를들어, DB 테이블과 매핑되는 자바코드를 생성해주는 작업이 이 단계에서 실행된다. 2. process-sources : 필터와 같은 작업을 소스 코드에 처리한다. 3. generate-resources : 패키지에 포함될 자원을 생성한다. 4. process-resources : 필터와 같은 작업을 자원 파일에 처리하고, 자원 파일을 클래스 출력 디렉토리에 복사한다. 5. compile : 소스 코드를 컴파일해서 클래스 출력 디렉토리에 클래스를 생성한다. 6. generate-test-sources : 테스트 소스 코드를 생성한다. 예를들어, 특정 클래스에서 자동으로 테스트 케이스를 만드는 작업이 이 단계에서 실행된다. 7. process-test-resources: 필터와 같은 작업을 테스트 소스 코드에 처리한다. 8. generate-test-resources: 테스트를 위한 자원 파일을 생성한다. 9. process-test-resources : 필터와 같은 작업을 테스트 자원 파일에 처리하고, 테스트 자원파일을 테스트 클래스 출력 디렉토리에 복사한다. 10. test-compile: 테스트 소스코드를 컴파일해서 테스트 클래스 출력 디렉토리에 클래스를 생성한다. 11. test : 테스트를 실행한다. 12. package : 컴파일 된 코드와 자원파일들을 jar, war와 같은 배포형식으로 패키징한다. 13. install : 로컬 리포지토리에 패키지를 복사한다. 14. deploy : 생성된 패키지 파일을

(이탈리아어) 영어는 be 동사 이탈리아어는 Essere 동사

I am = Io sono [이오쏘노] 1. 나는 ~입니다. (이오쏘노) 2. 우리는 ~ 입니다. [노이씨아모] -> Noi siamo~ 3. 너는 ~이다. [뚜 쌔이] ->Tu sei~ 4. 너희는 ~이다. [보v이 씨에데] -> Voi siete ~ 5. 당신은 ~입니다. [래이 애] -> Lei e~ 6. 당신들은 ~입니다. [보v이 씨에떼] -> Voi Siete ~ 7. 그는 ~입니다. [루이 애] ->Lui e 8.

(영어)

*choir 합창대. 성가대 *pope 교황 예) The sistine choir traces it history back 500 years, connecting the modern choir to singers that accompanied popes during the Middle Ages It`s been three decades the sistine Chapel choir has performed in the United States Choir members are looking forward to their US tour this September * shed 없애다, 탈피하다. 예) The group of 20 adults and 30 boys hope the beauty of their songs and technical skills of their performance help them shed a more recent nickname * routine (틀에박힌) 연기, 몸짓 * screamer 스크리머, 날카롭게 소리지르는 사람 예) In past decades, the choir was known more for their voulme and exaggerated operatic routine, prompting some to call them the "Sistine Screamers" * intimate 분위기 있는, 편안한 *  acoustics 음향사태, 음향시설 예) Today, their melodic sound is more in line with their musical history and the intimate acoustics of their famous chapel * halt 중단하다, 멈추다. * fall within ~의 범위에 들어가다. -> Solber`s airport falls within a ten mile raius of Trump`s

(자바8 - 함수형 프로그래밍 기법)

함수를 마치 일반값처럼 사용해서 인수로 전달하거나, 결과로 반환받거나, 자료구조에 저장할 수 있음을 의미한다. 일반 값처럼 취급할 수 있는 함수를 일급 함수 라고 한다. 바로 자바8이 이전버전과 구별되는 특징 중 하나가 일급 함수를 지원한다는 점이다. 자바8에서는 ::연산자로 메서드 레퍼런스를 만들거나 (int x) -> x + 1 같은 람다표현식으로 직접 함숫값을 표현해서 메소드를 함숫값으로 사용할 수 있다. 자바8에서는 다음과 같은 메서드 레퍼런스로 Integer.parsetInt를 저장 할 수 있다. Function<String, Integer> strToInt = Integer.parseInt 1. 고차원 함수 2. 커링 대부분 애플리케이션은 국제화를 지원해야 하는데 이때 단위 변환 문제가 발생할 수 있다. 보통 변환요소와 기준치 조정요소가 단위 변환 결과를 좌우한다. 다음은 섭씨를 화씨로 변환하는 공식이다. CtoF(x) = x*9/5 + 32 다음과 같은 패턴으로 단위를 표현할 수 있다. 1. 변환요소를 곱함 2. 기준치 조정요소를 적용 static double converter(double x, double y, double f) {   return x * f + b; } 위와같이 하면 인수에 변환요소와 기준치를 넣는 일은 귀찮은 일이며 오타도 발생하기 쉽다. 다음은 커링이라는 개념을 활용해서 한 개의 인수를 갖는 변환 함수를 생산하는 '팩토리' 를 정의하는 코드이다. static DoubleUnaryOperator curreidConverter(double f, double b) {  return (Double x) -> x * f +b; } 위 메소드에 변환요소(f)와 기준치 (b) 만 넘겨주면 우리가 원하는 작업을 수행할 함수가 반환된다. 예를들어, 다음은 팩토리를 이용해서 원하는 변환기를 생성하는 코드다. DoubleUnaryOper

(트러블 슈팅) JPA사용시 EnumType 입력 문제

JPA를 사용하면서 Repository단에서 Recommend.LIKE라는 EnumType을 입력했는데 디비에서 이를 문자열로 받지 못했다. 이를 위해서는 도메인 클래스에서 아래를 해주어야 한다. 그러면 String형으로 인식 @Enumerated (EnumType. STRING )

(QueryDSL) 빈 생성

QItem item = QItem.item; List<ItemDTO> result = query.from(item).list( Projections.bean(ItemDTO.class, item.name.as("username"), item.price);

(QueryDSL) 프로젝션과 결과반환

QItem item = QItem.item; List<Tuple> result = query.from(item).list(item.name, item.price); //List<Tuple> result = query.from(item).list(new QTuple(item.name, item.price)); 같다.

(QueryDSL) 서브쿼리

서브쿼리 결과가 하나면 unique(), 여러건이면 list() 를 사용할 수 있다. QItem item = QItem.item; QItem itemSub = new QItem("itemSub"); query.from(item) .where(item.price.eq(     new JPASubQuery().from(itemSub).unique(itemSub.price.max()) )) .list(item); query.from(item) .where(item.in( new JPASubQuery().from(itemSub) .where(item.name.eq(itemSub.name)) .list(itemSub) )) .list(item);

(QueryDSL) 조인

조인은 innerJoint(join), leftJoin, rightJoin, fullJoin을 사용할 수 있고 추가로 JPQL의 on과 성능 최적화를 위한 fetch조인도 사용할 수 있다. 조인의 기본문법은 첫 번째 파라미터에 조인 대상을 지정하고, 두 번째 파라미터에 별칭(alias)으로 사용할 쿼리 타입을 지정하면 된다. join(조인 대상, 별칭으로 사용할 쿼리타입) 예) QOrder order = QOrder.order; QMember member = QMember.member; QOrderItem orderItem = QOrderItem.orderItem; query.from(order) .join(order.member, member) .leftJoin(order.orderItems, orderItem) .list(order); query.from(order) .leftjoin(order.orderItems, orderItem) on(orderItem.count.gt(2)) .list(order); <패치조인사용> query.from(order) .innerJoin(order.member, member).fetch() .leftJoin(order.orderItems, orderItem).fetch() .list(order);