전체 글

Actions lead thoughts.
· Spring
AssertJ는 무엇인가? AssertJ assertion을 제공하는 자바 라이브러리 테스트 코드, 에러 메세지의 가독성을 높여줌 JUnit5에서도 AssertJ와 비슷하게 값 검증을 할 수 있는 Assertions의 assert메소드들을 제공한다. 그럼 이 둘 간 차이점이 무엇인지 아래 코드를 먼저 보자. assertEquals(expected, actual); assertThat(actual).isEqualTo(expected); 코드를 보면 알 수 있듯 AssertJ에서 제공하는 assertion의 가독성이 더 높다. AssertJ의 장점을 좀 더 구체적으로 알아보면 다음과 같다. 1. 테스트를 할 때 필요한 거의 모든 메소드를 제공 2. 메소드 체이닝을 지원해서 더 짧고 간결하게 코드 작성 가능 ..
· Spring
JUnit JUnit: 자바 개발자가 가장 많이 사용하는 Testing 기반 프레임워크 JUnit5: JAVA8 이상부터 지원 테스트 작성자를 위한 API, 테스트 실행을 위한 API가 분리되어 있음 이전 버전인 JUnit4와 비교해서 JUnit5는 3가지 모듈로 구성되어 있음 JUnit Platform JVM에서 테스트 프레임워크를 실행하는데 기초를 제공 TestEngine API를 제공해 테스트 프레임워크 개발 가능 JUnit Jupiter TestEngine API 구현체 (JUnit5에서 제공) JUnit5에서 테스트를 작성하고 확장하기 위한 새로운 프로그래밍 모델과 확장 모델의 조합 테스트 코드 작성 모듈: junit-jupiter-api 테스트 실행 모듈: junit-jupiter engine..
· Spring
QMember m = new QMember("m"); QClass를 사용할 때 앞선 코드에서는 위 코드처럼 사용했다. QMember로 들어가보면 아래와 같이 QMember에 static 메소드가 있다. 이것을 이용해 좀 더 편리하게 QMember 인스턴스를 만들 수 있다. QMember member = QMember.member; 여기서 QMember.member를 static으로 선언해 아래처럼 더 줄일 수 있다. QMember의 static메소드를 다시 보자. public static final QMember member = new QMember("member1)" member1으로 이름이 설정되어 있기 때문에 쿼리가 member1을 기준으로 아래와 같이 나간다. select member1 from ..
QueryDsl 도메인 생성 엔티티 생성 QueryDsl을 실제 사용하기에 앞서 쿼리에서 사용할 엔티티를 두 개 만들었다. 엔티티 테스트 그 후 연관관계나 세팅 등이 잘 됐는지 간단한 테스트를 실행해본다. in-memory DB 세팅 참고 dongb.tistory.com 앞선 포스트에서 만든 엔티티를 이용해 JPQL과 Querydsl을 비교해보겠다. member와 team세팅 같은 작업은 BasicTest라는 코드를 만들어 적어두고 실제 테스트 코드에서 BasicTest를 상속하는 형태로 작성했다. JPQL 먼저 memberName이 member1과 같은 멤버를 찾는 코드를 JPQL로 작성해보았다. setParameter로 파라미터 바인딩을 통해 해당하는 member를 찾는 형태이다. Querydsl 위..
· Spring
엔티티 생성 QueryDsl을 실제 사용하기에 앞서 쿼리에서 사용할 엔티티를 두 개 만들었다. 엔티티 테스트 그 후 연관관계나 세팅 등이 잘 됐는지 간단한 테스트를 실행해본다. in-memory DB 세팅 참고로 DB에 들어간 데이터를 직접 보기 위해 application.yml에 h2로 in-memory DB를 설정해주었다. datasource: url: jdbc:h2:mem:test username: sa password: driver-class-name: org.h2.Driver h2: console: enabled: true path: /h2-console 위와 같이 설정하면 localhost:8080/h2-console로 접속해 DB를 직접 볼 수 있다. 다음부터는 이 엔티티를 가지고 query..
· Spring
우리는 Spring Data Jpa를 이용해 여러 방법으로 쉽게 쿼리를 만들고 작동시킬 수 있었다. 쿼리가 복잡해질 경우 @Query와 같은 어노테이션으로 쿼리를 직접 작성할 수 있다. 하지만 이렇게 되면 쿼리에 문제가 있는지 여부를 런타임시에 알 수밖에 없다. 이런 문제를 극복하기 위해 쿼리를 코드로 작성하는 QueryDsl을 이용할 수 있다. QueryDsl은 spring data jpa와 달리 코드로 쿼리를 짜기 때문에 컴파일 시점에 쿼리에 문제가 있는지 여부를 알 수 있다. Querydsl 설정 querydsl은 스프링 스타터에서 추가할 수 없기 때문에 별도로 build.gradle에 관련 라이브러리를 넣어주어야 한다. plugins { ... // querydsl id 'com.ewerk.gra..
Action-Slack Github actions를 이용하여 빌드 결과를 알림으로 받을 수 있다. 텔레그램이나 Slack등 다양한 방식으로 알림을 받을 수 있다. 그 중 업무적으로 가장 많이 사용하는 메신저인 Slack과 연동하여 빌드 결과를 알림받을 수 있도록 해보겠다. Action-Slack 을 이용하여 손쉽게 연동할 수 있다. 공식 사이트에 들어가면 usage나 fields를 확인할 수 있다. Slack webhook url 발급 먼저 Slack api에 들어가서 create new app을 누르고, 본인이 원하는 App Name, development slack workspace를 선택해서 새로운 앱을 만들어준다. 그러면 위와 같은 페이지가 나온다. 이 중 Incoming Webhooks를 클릭하..
주소 바인딩 프로그램이 실행을 위해 메모리에 적재되면 그 프로세스를 위한 독자적인 주소 공간이 생기는데 이를 논리적 주소 또는 가상 주소라고 부른다.논리적 주소는 프로세스마다 독립적으로 0번지부터 할당된다. 물리적 주소는 실제로 데이터가 메모리에 올라가는 위치를 말한다. 낮은 주소에는 운영체제, 높은 주소에는 사용자 프로세스가 적재된다. 우리는 메모리에 적재된 프로세스를 실행시키기 위해 논리적 주소를 물리적 주소로 변환하는 작업이 필요한데 이를 주소 바인딩이라고 한다. 주소 바인딩 분류 물리적 주소를 언제 결정하는 지에 따라 세가지로 분류가 가능하다. 컴파일 타임 바인딩 코드가 컴파일 될 때 물리적 주소가 결정되는 방식 프로그램 내부에서 사용하는 주소와 물리적 주소가 동일하다. 물리적 주소를 변경하려면 ..
프로세스와 스레드 프로세스: 실행중인 프로그램 스레드: 프로세스의 실행 단위 즉, 스레드는 한 프로세스 안에서 동작되는 여러개의 실행 흐름이라고 할 수 있다. 프로세스 간 통신 VS 스레드 간 통신 결론부터 말하면 스레드 간 통신이 프로세스 간 통신보다 더 빠르다. 같은 프로세스에 속한 스레드들은 코드, 데이터, 힙을 공유하고 각각 별도의 스택 영역을 갖는다. 때문에 변수는 스레드 간 공유될 수 없지만 코드, 데이터, 힙 영역이 공유되므로 컨텍스트 스위칭 비용이 줄어든다. 컨텍스트 스위치가 일어날 때 캐시를 비우지 않는 것 또한 컨텍스트 스위칭 비용을 줄인다. 컨텍스트 스위칭 Context Switching은 한 task가 끝날 때까지 CPU가 놀게 놔두지 않고 여러작업을 번갈아 실행 시키며 동시에 처리..
· Java
자바를 플랫폼 독립적인 언어라고 부르는 이유 자바는 JVM 위에서 동작하는데 이 JVM이 OS에 독립적이다. 자바의 실행 원리 코드를 javac라는 명령어를 통해 컴파일을 한다. 이를 완료하면 .class라는 바이트코드가 생성되는데 이 파일은 java라는 명령어를 통해 실행할 수 있다. .class를 실행하면 JVM이 클래스 파일을 읽어 프로그램을 실행하게 된다. JVM, JRE, JDK의 차이 JVM은 자바 클래스 파일을 실행하는 역할, JRE는 JVM이 실행될 수 있는 환경을 만들어줌, JDK는 개발할 수 있는 여러 툴들을 제공 JVM은 컴파일 된 클래스 파일을 구동하는 역할을 한다. JRE는 클래스 파일을 읽는 class loader, 로딩된 클래스 파일을 검증하는 bytecode verifier,..
dongb
Now or Never