본문 바로가기

전체 글376

[Java] Matcher 클래스를 사용한 커스텀 구분자 지정 기존의 요구사항 기존에는 콤마(,)와 콜론(:)을 구분자로 사용했다고 가정하자. 그렇다면, 아래와 같은 메서드를 구현할 수 있다. private static String[] split(String text) { return text.split(",|:"); } 요구사항 변경 하지만, 요구사항이 사용자가 아래와 같이 "//"와 "\n" 문자 사이에 커스텀 구분자를 지정할 수 있다고 변경되었다고 한다면? 그렇다면 split() 메서드를 수정해야한다. //;\n1;2;3 아래와 같이 수정할 수 있다. private static String[] split(String text) { Matcher m = Pattern.compile("//(.)\n(.*)").matcher(text); if( m.find() ) .. 2023. 4. 18.
[JUnit] AssertJ 라이브러리의 문자열 테스트와 숫자 테스트의 메서드 라이브러리 의존성 설정 Java8 이상 기반 프로젝트는 3.x 버전을, Java7 이하 기반 프로젝트는 2.x 버전을 사용해야 한다. Gradle testCompile 'org.assertj:assertj-core:3.6.2' Maven org.assertj assertj-core 3.6.2 test 테스트 대상 지정 모든 테스트 코드는 assertThat() 메서드에서 출발하며, 다양한 메서드를 연쇄 호출해서 코드를 작성함. assertThat(테스트 타켓).메소드1().메소드2().메소드3(); 문자열 테스트 assertThat("Hello, world! Nice to meet you.") // 주어진 "Hello, world! Nice to meet you."라는 문자열은 .isNotEmpty() .. 2023. 4. 14.
[JUnit] 스트림(Stream)을 이용한 JUnit기반 테스트 코드 작성 도메인 모델 사람의 속성인 이름과 나이를 멤버 변수로 가지는도메인 모델이다. public class Person { private String name; private int age; public Person( String name, int age ) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } 요구사항 충족하는 테스트 코드를 작성 사람들 중에 성인(나이가 26.. 2023. 4. 14.
[Convention] Commit Message Conventions 커밋 메시지와 관련된 요약된 원칙 제목과 본문은 빈줄로 구분 제목은 명령어 형태로 작성, 50자 이내로 제한 제목에는 아래와 같은 접두사를 사용 feat 기능 추가 fix 버그 수정 docs 문서 업데이트 style 코드 스타일 변경 refactor 코드 리팩토링 test 테스트 코드 추가 또는 수정 chore 빌드, 배포 등의 작업 본문은 변경 사항에 대한 자세한 설명 작성 본문은 72자마다 줄바꿈, 한줄에는 80자 제한 본문에는 변경 사항의 원인, 영향, 해결 방법 기술 본문에는 "Closes #이슈번호" 형식으로 관련 이슈를 참조 제목 접두사 별 예시 여러 줄로 커밋 메시지를 작성하려고 하면, 줄바꿈이나 특수 문자('^' 등)가 올바르게 처리되지 않을 수 있음. 따라서 텍스트 편집기(메모장 등)에 .. 2023. 4. 13.
[JUnit] assertj 활용한 테스트 코드 작성 해당 글은 NEXTSTEP 자바 플레이그라운드 with TDD, 클린 코드를 통해서 새롭게 배우고 내용을 기록한 글입니다. contains(String values) 배열로 반환하는 값의 경우 assertj의 contains()를 활용해 반환 값이 맞는지 검증 @Test void split1() { String actual = "1,2"; String[] actualSplit = actual.split(","); assertThat(actualSplit).contains("1"); assertThat(actualSplit).contains("2"); } containsExactly(String values) 배열로 반환하는 값의 경우 assertj의 containsExactly()를 활용해 반환 값이 맞.. 2023. 4. 12.
[Spring] AOP(Aspect Oriented Programming)에 대해서 AOP란? AOP를 이해하는데 가장 중요한 핵심 개념이 바로 관심 분리이다. AOP에서는 메서드마다 공통으로 등장하는 로깅이나 예외, 트랜잭션 처리 같안 코드들을 횡단 관심이라고 한다. 이에 반해 사용자의 요청에 따라 실제로 수행되는 핵심 비즈니스 로직을 핵심 관심이라고 한다. 만약 이 두 관심을 완벽하게 분리할 수 있다면, 개발자가 구현하는 메서드에는 실제 비즈니스 로직만으로 구성할 수 있으므로, 더욱 간결하고 응집도 높은 코드를 유지할 수 있다. AOP 용어 간략 정리 조인포인트(Joinpoint) 클라이언트가 호출하는 모든 비즈니스 로직을 말함. 포인트컷으로 설정될 수 있는 메서드라고 이해하면 쉽다.( 포인트컷 대상 혹은 포인트컷 후보) 포인트컷(Pointcut) 필터링된 조인포인트를 의미한다. 포.. 2023. 4. 11.
[MySQL] 처리 대기(SLEEP)와 벤치마크(BENCHMARK) SLEEP(): 일부로 쿼리의 실행을 멈추는 함수SLEEP() 함수는 프로그래밍 언어나 쉡 스크립트 언에서 제공하는 sleep 기능을 수행한다. SQL의 개발이나 디버깅 용도로 잠깐 대기하거나 일부로 쿼리의 실행을 오랜시간 유지하고자 할 때 상당히 유용한 함수이다. 해당 함수는 대기할 시간을 초 단위로 인자를 받으며, 특별히 어떠한 처리를 하거나 반환 값을 넘겨주지 않는다. 단지 지정한 시간만큼 대기할뿐이다.SELECT SLEEP(1.5) FROM {테이블명} 추가적으로, 레코드이 건수만큼 SLEEP() 함수를 호출하기 때문에 조회되는 레코드가 총 10건이라고 하면, 결국 전체적으로 15초 동안 쿼리를 실행하는 셈이 된다. BENCHMARK(): 간단한 함수의 성능 테스트를 하는 함수디버깅이나 간단한 함.. 2023. 4. 11.
[MySQL] CASE WHEN과 서브쿼리를 활용한 쿼리 최적화 CASE WHEN 이란? CASE WHEN은 함수가 아닌 SQL 구문이다. 프로그래밍 언에서 제공하는 SWTICH 구문과 같은 역할을 한다. CASE로 시작하고 END로 끝나야 하며, WHEN ... THEN ... 은 필요한 만큼 반복해서 사용할 수 있다. CASE WHEN 조건 THEN '반환 값' WHEN 조건 THEN '반환 값' ELSE 'WHEN 조건에 해당 안되는 경우 반환 값' END 동등 연산자(=)로 비교할 수 있을 때 비교하고자 하는 컬럼이나 표현식을 CASE와 WHEN 키워드 사이에 두고, 비교 기준값을 WHEN 뒤에 입력해서 사용하는 방식이다. CASE WHEN 구문에서 한 가지 중요한 사실은 CASE WHEN 절이 일치하는 경우에만 THEN 이하의 표현식이 실행된다는 점이다. C.. 2023. 4. 11.
[MySQL] BETWEEN 연산자를 활용한 쿼리 최적화 BETWEEN 연산자 BETWEEN 연산자는 "크거나 같다"와 "작거나 같다"라는 두 개의 연산자를 하나로 합친 연산자다. 다른 비교 조건과 결합해 하나의 인덱스를 사용할 때 주의해야 할 점이 있다. 아래 동등 비교 연산자와 BETWEEN 연산자를 이용해 부서 번호와 사원 번호로 dept_emp 테이블을 조회하는 다음 쿼리를 한번 생각해보자. SELECT * FROM dept_emp WHERE dept_no = 'd003' AND emp_no = 100001; SELECT * FROM dept_emp WHERE dept_no BETWEEN 'd003' AND 'd005' AND emp_no = 100001; dept_emp 테이블에는 (dept_no, emp_no) 컬럼으로 구성된 프라이머리 키가 존재한.. 2023. 4. 11.