본문 바로가기

전체 게시글374

[Java] 상태 데이터를 get하지 말고 메시지를 보내라. 해당 글은 NEXTSTEP 자바 플레이그라운드 with TDD, 클린 코드를 통해서 새롭게 배우고 내용을 기록한 글입니다. 상태 데이터를 get하지 말고, 메시지를 보내라 상태 데이터를 get 하지말라는 말의 의미를 이해해보자. public class Winners { private final List cars; private List findWinners(int maxPositionValue) { List winners = new ArrayList(); for( Car car : cars ) { if( car.getPosition() == maxPositionValue) winners.add(car); } return winners; } } 위 코드를 이해해보자. 'finWinners' 메서드는 최대 .. 2023. 4. 25.
[Java] 단일 책임 원칙(SRP)을 지키는 방법 / 모든 원시 값과 문자열을 포장 해당 글은 NEXTSTEP 자바 플레이그라운드 with TDD, 클린 코드를 통해서 새롭게 배우고 내용을 기록한 글입니다. 왜 모든 원시 값과 문자열을 포장해야할까? 아래 코드를 살펴보자. 현재 멤버 변수에는 'name'과 'position'이 존재 하며, 대충 봤을 때는 Car 클래스는 복잡도가 그렇게 높진 않다. 만약, 요구사항이 추가되어서 멤버 변수가 더 늘어나서 100개 이상이 된다면 어떨까? public class Car { private static final int MIN_FORWARD_VALUE = 4; private static final int MAX_NAME_LENGTH_VALUE = 5; private String name; private int position; public Car.. 2023. 4. 25.
[Java] 요구사항이 자주 변경되는 코드에 대한 리팩토링 / 전략 패턴 ( Strategy Pattern ) / 의존관계 주입(DI) 초기의 요구사항 package racing; public class Car { private static final int FORWARD_NUM = 4; private static final int MAX_BOUND = 10; private String name; private int position; public void move(int number) { if( isMove(number) ) { this.position += 1; } } private boolean isMove(int number) { return number >= MIN_FORWARD_NUMBER; } //생략.. } Car 라는 클래스는 Car의 이름을 의미하는 멤버변수 'name'과 Car의 위치를 의미하는 멤버변수 'positi.. 2023. 4. 24.
[Convention] 디미터 법칙(Law of Demeter) 디미터 법칙이란? 객체지향 프로그래밍의 원칙 중 하나로, 객체 간의 결합도를 낮추고, 객체의 캡슐화를 강화하기 위한 원칙이다. 이를 간단하게 요약하면 "긴 객체 구조의 경로를 따라 멀리 떨어져 있는 간접적인(낯선) 객체에 메시지를 보내는(또는 이야기하는) 설계는 피하라는 것이다."라고 할 수 있다. 디미터 법칙에 따르면, 객체는 자신이 조작하는 객체의 내부 구조를 최소화하고, 다른 객체와의 상호작용을 제한해야 한다. 객체는 자신이 직접 소유하거나 관리하는 멤버에만 접근하고, 다른 객체의 내부 구조를 노출하는 것을 피해야 한다. 디미터 법칙의 주요 원칙 객체는 자신이 직접 소유하거나 관리하는 멈버에만 접근해야 한다. 객체는 다른 객체의 내부 구조를 노출하는 것을 피하고, 다른 객체와의 상호작용은 메서드를 .. 2023. 4. 22.
[JUnit] 테스트하기 어려운 코드를 테스트 하기 쉬운 코드로 테스트하기 어려운 코드 package racing; public class Car { private static final int FORWARD_NUM = 4; private static final int MAX_BOUND = 10; private String name; private int position; public void move() { if( getRandomNo() >= FORWARD_NUM) this.position++; } private int getRandomNo() { Random random = new Random(); return random.nextInt(MAX_BOUND); } //생략.. } Car 라는 클래스는 Car의 이름을 의미하는 멤버변수 'name'과 Car의 위치를.. 2023. 4. 22.
[MySQL] WHERE 절에서의 인덱스 사용 / AND 연산자로 연결된 경우와 OR 연산자로 연결된 경우 인덱스 칼럼 순서와 where 조건절 칼럼 순서가 중요한 이유 다음 구조를 가진 테이블을 살펴보자. CREATE TABLE employees ( id INT PRIMARY KEY, first_name VARCHAR(50), last_name VARCHAR(50), age INT, city VARCHAR(50) ); 두가지의 쿼리를 살펴보자. 쿼리 1 SELECT * FROM employees WHERE age > 30 AND city = 'New York'; 쿼리 2 SELECT * FROM employees WHERE city = 'New York' AND age > 30; 쿼리1과 쿼리2는 모두 동일한 조건을 가지지만, WHERE절에서 명시한 컬럼의 순서가 다르다. 그렇다면, 두 개의 인덱스를 만들어.. 2023. 4. 19.
[MySQL] WHERE 절 / 칼럼의 값을 변경했을 때의 인덱스 적용 / 비교 대상의 데이터 타입 칼럼을 가공한 후 다른 상숫값 비교 인덱스를 사용하기 위한 기본 규칙 WHERE 절이나 ORDER BY 또는 GROUP BY가 인덱스를 사용하려면 기본적으로 인덱스된 칼럼의 값 자체를 변환하지 않고 그대로 사용한다는 조건을 만족해야 한다. 인덱스는 칼럼의 값을 아무런 변환 없이 B-Tree에 정렬해서 저장하기 때문이다. WHERE 절이나 ORDER BY 또는 GROUP BY에서도 원본값을 검색하거나 정렬할 때만 B-Tree에 정렬된 인덱스를 이용한다. 인덱스를 적절하게 이용하지 못하는 경우 아래 쿼리는 WHERE 절에서 칼럼을 가공한 후 다른 상숫값과 비교했을 때, 인덱스를 적절하게 이용하지 못하는 경우다. SELECT * FROM salaries WHERE salary*10 > 150000; 위 쿼리를.. 2023. 4. 19.
[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.