전체 글376 [Spring] Controlle가 직접 DAO 객체의 메서드를 호출하면 안되는 몇가지 이유에 대해서 Controller는 매개변수를 통해 전달된 DAO 객체를 이용해 사용자가 요청한 로직 처리 아래 코드를 살펴보자. @Controller @SessionAttributes("board") public class BoardController { @RequestMapping("/insertBoard.do") public String insert(BoardVO vo, BoardDAO boradDAO) { boradDAO.insertBoard(vo); return "redirect:getBoardList.do"; } @RequestMapping("/updateBoard.do") public String updaate(@ModelAttribute("board") BoardVO vo, BoardDAO boardDA.. 2023. 4. 29. refactor: 상속과 인터페이스 활용 해당 글은 NEXTSTEP 자바 플레이그라운드 with TDD, 클린 코드를 통해서 새롭게 배우고 내용을 기록한 글입니다. 1. 상황 가정 우리는 렌터카를 운영하고 있다. 현재 보유한 차량의 목록과 대수는 아래와 같다. Sonata : 2대 Avante : 1대 K5: 2대 차량을 예약할 때는 여행할 목적지의 이동거리를 입력받는다. 이때, 이동거리를 활용해 차량 별로 필요한 연료를 주입한다. 차량별 연비는 아래와 같다. Sonata : 10km/리터 Avante : 15km/리터 K5 : 13km/리터 2. 공통 기능을 구현할 클래스의 메서드 목록을 나열해보자. 리터당 이동 거리. 즉, 연비 ==> abstract double getDistancePerLiter(); 여행하려는 거리 ==> abstrac.. 2023. 4. 27. [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. 이전 1 ··· 5 6 7 8 9 10 11 ··· 42 다음