본문 바로가기

전체 글86

Kotlin으로 Spring Boot JPA 프로젝트에 Querydsl 적용하기 코드 작성 과정과 방법은 모두 https://jojoldu.tistory.com/372에서 참조하였다. build.gradle.kts build.gradle.kts에서 Querydsl을 사용하기 위한 gradle 설정을 추가한다. apply(plugin = "kotlin-kapt") apply(plugin = "kotlin-jpa") sourceSets["main"].withConvention(KotlinSourceSet::class) { kotlin.srcDir("$buildDir/generated/source/kapt/main") } dependencies { kapt("org.springframework.boot:spring-boot-configuration-processor") compile("c.. 2019. 10. 1.
[Spring Boot] Actuator를 추가했는데 404 에러가 발생하는 경우 단순히 dependency만 추가하면 일부 페이지(/actuator, /actuator/health)만 노출되고 나머지에서는 404 에러가 발생한다. 이유는 endpoint가 차단된 상태이기 때문이다. 따라서 아래 설정을 application.yml에 추가해서 모든 endpoint를 노출해주면 다른 URL로도 접근할 수 있다. management: endpoints: web: exposure: include: "*" 2019. 9. 20.
[Sphinx/LaTeX] fncychap package로 pdf 문서 챕터 스타일 변경 Inclusion of the “fncychap” package (which makes fancy chapter titles), default '\usepackage[Bjarne]{fncychap}' for English documentation (this option is slightly customized by Sphinx), '\usepackage[Sonny]{fncychap}' for internationalized docs (because the “Bjarne” style uses numbers spelled out in English). Other “fncychap” styles you can try are “Lenny”, “Glenn”, “Conny”, “Rejne” and “Bjornstr.. 2019. 9. 18.
Kotlin Infix Notation (중위 표기법) infix vs. postfix vs. prefix infix(중위표기법) 일상생활에서의 수식 표기법으로 두 개의 피연산자 사이에 연산자가 존재하는 표현방식이다. ex. X + Y postfix 연산자를 피연산자 뒤에 표시하는 방식이다. 옛날에 계산기 과제 할 때 stack 써서 많이 바꾸던 그 방식! ex. X + Y를 postfix로 변환하면 X Y + prefix 연산자를 피연산자 앞에 표시하는 방식이다. Kotlin에서의 Infix Notaion Kotlin에서 infix 키워드를 사용하여 Infix Notation(중위표기법)으로 함수를 호출할 수 있다. 단, 아래 요건을 충족해야 한다. They must be member functions or extension functions. They m.. 2019. 9. 17.
[Sphinx/LaTeX] Sphinx를 사용하여 한글 pdf 문서 만들기 만들어진 API 문서를 pdf로 변환하거나 별도의 매뉴얼 문서를 pdf로 만들고자 할 때 Sphinx와 LaTeX를 사용하여 쉽게 만들 수 있다. Sphinx를 사용해서 만든 pdf 문서의 예시는 Sphinx 매뉴얼 문서를 참고한다. - https://buildmedia.readthedocs.org/media/pdf/sphinx/stable/sphinx.pdf TeX Live와 같은 LaTeX와 한글 글꼴이 미리 설치되어 있어야 한다. TeX Live, 한글 글꼴 설치 TeX Live 설치 - http://wiki.ktug.org/wiki/wiki.php/TeX%20Live%20%EC%84%A4%EC%B9%98%20%28Windows%29 Naver 나눔글꼴 설치 - https://hangeul.nave.. 2019. 9. 16.
Wiring in Spring (@Resource, @Inject, @Autowired 차이) Spring Framework에는 의존성 주입과 관련된 annotation @Resource, @Inject, @Autowired가 있다. 모두 setter와 field에서 사용할 수 있다. @Resource Match by Name Match by Type Match by Qualifier 위 우선순위대로 의존성이 주입된다. @Inject Match by Type Match by Qualifier Match by Name 위 우선순위대로 의존성이 주입된다. @Inject annotaion을 사용하려면 Gradle 또는 Maven에서 javax.inject 라이브러리를 사용하도록 설정해야 한다. @Autowired Match by Type Match by Qualifier Match by Name 의존성.. 2019. 9. 15.
[Spring Boot/JPA] hibernate.ddl-auto 옵션으로 서버를 실행할 때마다 DB 초기화하기 JPA로 DB를 초기화하는 방법은 두 가지가 있다. spring.jpa.generate-ddl (boolean) switches the feature on and off and is vendor independent. spring.jpa.hibernate.ddl-auto (enum) is a Hibernate feature that controls the behavior in a more fine-grained way. This feature is described in more detail later in this guide. 여기서 2. spring.jpa.hibernate.ddl-auto를 통해 DB 초기화 전략을 만들 때 사용할 수 있는 옵션 값은 none, update, validata, cre.. 2019. 9. 13.
[JPA/MySQL] Specified key was too long; max key length is 1000 bytes 증상 Spring Boot Application을 시작할 때 Hibernates가 테이블을 생성하는 시점에서 에러 발생 Caused by: java.sql.SQLSyntaxErrorException: Specified key was too long; max key length is 1000 bytes at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120) ~[mysql-connector-java-8.0.16.jar:8.0.16] at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) ~[mysql-connector-java-8.0.16... 2019. 9. 12.
Vue.js에 SSL 인증 추가하기(https) 작업은 ROOT CA 인증서 발급한 후 SSL 인증서 발급, Vue.js에 인증서 정보 추가 순으로 진행된다. 1. SSL 인증서 발급 1.0. Terms SSL 인증 관련 용어 정리 PKI Public Key Infrastructure Asymmetric Key Algorithm을 사용 Key 한 쌍 - Private, Public Key 생성 Private Key는 개인만이 소유 Public Key는 공개 RFC 2459 표준문서 참고 (참고) X.509는 인증서 포맷을 의미함 CA Certificate Authority, 공인 인증 기관 일반적으로 우리가 발급 받는 인증서는 신뢰할 수 있는 기관이 발급하고, 상위 기관의 서명을 받음 인증 기관들도 상하위 관계가 있고, 최상위 기관을 ROOT CA라고.. 2019. 9. 11.
Akka란? - 필요성, Actor model, Akka의 특징 Akka는 오픈 소스 툴킷으로 JVM 상의 동시성과 분산 애플리케이션을 단순화한다. Java와 Scala 모두로 작성 가능하다. Scala로 작성되었지만 Java의 동시성 패키지를 사용하기 때문에 결국은 Java의 Thread나 Task를 사용하는 것과 마찬가지다. 필요성 - 암달의 법칙(Amdahl’s law) “멀티코어를 사용하는 프로그램의 속도는 프로그램 내부에 존재하는 순차적(sequential) 부분이 사용하는 시간에 의해서 제한된다.” 우리들은 동시성 구현을 위해 Tread나 Task를 ExecutorService에 제출하는 코드를 작성하고, 이를 실행하면 여러 개의 Thread가 동시에 작업을 수행한다. 하지만 Thread 또는 Task를 사용하지 않는 부분이 코드상에 존재하고, 이 부분은 .. 2019. 9. 10.
Golang panic(패닉)과 recover(복구): Java에서의 try-catch 구문 panic 프로그램 실행 중에 에러가 발생(= 런타임 에러)하여 종료되는 상황을 패닉이라고 표현한다. Java에서의 Exception과 유사한 상황이다. 배열의 범위를 넘어서는 인덱스로 접근하는 상황이 대표적인 예시이다. 패닉이 발생하면 현재 함수를 즉시 멈추고 defer 함수들을 모두 실행한 후 즉시 리턴한다. func main() { fmt.Println(divide(1, 0)) } func divide(a, b int) int { return a / b } panic: runtime error: integer divide by zero 런타임 에러뿐만 아니라 panic 함수를 사용해서 직접 에러를 발생시킬 수도 있다. panic(Error_Message) func main() { panic("Err.. 2019. 9. 10.
[Java] Number와 String 특징 정리 - Primitive, Autoboxing, String, StringBuilder, StringBuffer Java Numbers and String 개발 시 성능에 영향을 줄 수 있으므로 꼭 알아야 할 Number와 String의 특징들을 정리해두었다. Numbers Primitive Type & Boxed Primitive Type Primitive type Wrapper class boolean Boolean byte Byte char Character float Float int Integer long Long short Short double Double Java에는 기본 자료형인 Primitive type과 객체로 제공되는 Wrapper class(=Boxed Primitive Type)가 있다. Primitive에서 Boxed Primitive로의 전환(boxing), Boxed Primitive.. 2019. 9. 8.
Java GC(Garbage Collection) Naver D2에 워낙 잘 설명돼있어서 이 페이지만 읽어봐도 GC에 대해 개념을 잡을 수 있다. 이 포스팅은 그냥 내가 읽기 편하려고 Naver D2 포스팅을 요약 정리한 것이다. (마찬가지로 D2에서 올린 Garbage Collection 튜닝도 매우 유익하다.) Java GC(Garbage Collection) Java에서는 개발자가 코드로 메모리를 명시적으로 해제하지 않기 때문에 Garbage Collector가 더는 필요 없는 객체를 찾아 지우는 작업을 한다. Garbage Collector는 'weak generational hypothesis'라는 두 가지 전제 조건에 의해 만들어졌다. 대부분 객체는 금방 접근 불가능 상태(unreachable)가 된다. 오래된 객체에서 젊은 객체로의 참조는 .. 2019. 9. 7.
Golang defer (지연 호출) 지연 호출은 특정 함수를 현재 함수가 끝나기 직전에 실행하는 기능이다. Java에서의 try, catch, finally 구문에서 finally와 유사한 동작을 한다. func hello() { fmt.Println("Hello") } func world() { fmt.Println("World") } func main() { defer world() // world 함수가 나중에 호출된다. hello() hello() } Hello Hello World 지연 호출할 함수는 여러 개를 선언해도 되며, 이때 실행되는 순서는 LIFO이다. 따라서 맨 나중에 호출한 함수가 먼저 실행된다. func hello() { fmt.Println("Hello") } func world() { fmt.Println("Wo.. 2019. 9. 7.
Golang Closure 클로저(Closure)는 함수 안에서 함수를 선언 및 정의할 수 있고, 바깥쪽 함수에 선언된 변수에도 접근할 수 있는 함수를 말한다. 내부에 있는 함수의 입장에서 보았을 때 바깥 함수가 변수와 자기 자신(함수)을 에워싸고(close over) 있다고 해서 Closure라고 한다. func main() { a, b := 5, 10 f := func(x int) int { // main 함수내에 함수 f 정의 return a\*x + b // a, b는 f 외부에서 정의된 변수 } fmt.Println(f(2)) // 20 } 언뜻 보기에는 필요 없어 보일 수 있겠지만, 같은 지역변수를 계속해서 사용하고 싶을 때 유용하다. 지역변수는 함수 실행이 끝나면 소멸된다. 하지만 클로저에서 선언한 지역변수는 함수를 .. 2019. 9. 6.
[JVM] Java 메모리 구조 JVM JVM(Java Virtual Machine, 자바 가상 머신)은 자바 바이트 코드를 실행한다. 일부 프로그램(예를 들어 C로 개발된)은 실행되기 위해 OS에 의해 메모리가 제어되며 실행되는 반면 자바 프로그램은 JVM이 OS로부터 메모리를 할당받아 실행하는 구조이다. 덕분에 OS로부터의 종속이 없어서 널리 사용되고 있다. 이론적으로 모든 자바 프로그램은 CPU와 OS의 종류와 무관하게 독립적으로 동작하는 것을 보장한다. JVM 내부 구조 Runtime Data Area: JVM이 프로그램을 수행하기 위해 OS로 부터 할당받은 메모리 공간이다. Class Loader: Runtime에 컴파일러에 의해 변환된 Byte Code(.class)를 읽어서 JVM내의 Runtime Data Area(메모리.. 2019. 9. 5.