본문 바로가기

Java152

[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.
[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.
[Java] 왜 DI(Dependency Injection)가 필요한가? 의존관계(Dependency)에 대해서 DI에 대해 이야기 하기 전에 먼저 의존관계에 대해서 알아봐야한다. 객체에게 의존관계란 무엇인가? 어느 순간 의존관계가 발생하는가? 의존관계란 객체 혼자 모든 일을 처리하기 힘들기 때문에 내가 해야 할 작업을 다른 객체에게 위임하면서 발생한다. 즉, 내가 가지고 있는 책임과 역할을 다른 객체에 위임하는 순간 발생하는 것이다. 예를 들면, Service 클래스와 DAO(Repository) 클래스가 있다고 가정해보자. Service 클래스에서 하나의 기능을 구현하기 위해 DAO 클래스에게 데이터베이스 접근 로직을 위임하고 있다. 이때, Service 클래스는 작업(기능구현)을 완료하기 위해 DAO 클래스에게 의존하고 있다면, 이는 의존관계를 가지고 있는 것이다. DI.. 2023. 4. 10.
[Java] MVC 프레임워크에서 @RequestMapping 애노테이션 설정을 활용한 매핑하는 클래스 뜯어보기 [Java] @Controller 애노테이션 설정 클래스 스캔하는 ControllerScanner 클래스 뜯어보기 ControllerScanner 생성자 ControllerScanner 클래스가 생성될 때, basePackage를 입력받는다. 입력받은 basePackage를 이용해 reflections 객체를 생성한다. private Reflections reflections; public ControllerScanner( Object...basePack starting-coding.tistory.com 앞에서 @Controller 설정이 되어 있는 클래스를 찾았다. @RequestMapping 애노테이션이 설정된 메서드 아래를 보자. 찾은 컨트롤러 클래스의 @RequestMapping 애노테이션 설정을.. 2023. 4. 4.
[Java] @Controller 애노테이션 설정 클래스 스캔하는 ControllerScanner 클래스 뜯어보기 ControllerScanner 생성자 ControllerScanner 클래스가 생성될 때, basePackage를 입력받는다. 입력받은 basePackage를 이용해 reflections 객체를 생성한다. private Reflections reflections; public ControllerScanner( Object...basePackage) { reflections = new Reflections(basePackage); } getControllers() reflections 객체를 이용하여 @Controller 어노테이션이 적용된 클래스들을 스캔한다. 스캔된 클래스들을 instantiateControllers() 메서드를 통해 객체화한다. 객체화된 Controller 인스턴스들을 Class와 .. 2023. 4. 4.
[Java] Class 클래스 / 리플렉션 / 동적로딩 Class 클래스 자바의 모든 클래스와 인터페이스는 컴파일 되고 나면 class 파일로 생성된다. 예를 들어, a.java 파일이 컴파일 되면 a.class 파일이 생성되고 이 class 파일에는 클래스나 인터페이스에 대한 변수, 메서드, 생성자 등의 정보가 들어간다. 이때, Class 클래스는 컴파일된 class 파일에 저장된 클래스나 인터페이스 정보를 가져오는 사용한다. Class 클래스 사용하는 이유 프로그래밍에서 변수를 선언할 때 자료형을 미리 파악하고 그 자료형에 따라 변수를 선언한다. 클래스를 사용할 때도 이미 그 클래스의 정보(변수, 메서드)를 알고 있는 상황에서 프로그램을 만든다. 그런데 반환받는 클래스가 정확히 어떤 자료형인지 모르는 상황도 있다. 이때, Class 클래스를 활용해서 이 .. 2023. 4. 4.
[Servlet-jsp] 서비스(Service) 클래스 추가를 통한 컨트롤러 중복 제거 Controller에서 발생하는 코드의 중복 질문 삭제 기능을 아래와 같이 웹 어플리케이션과 모바일 모두에 대응하기 위해 2개의 Controller를 구현할 때 생기는 중복을 어떻게 제거할까?.. 고민해 볼 만한 문제이다. 우선, 코드 구현을 위해 아래 요구사항을 보자. 댓글이 없는 경우 질문 삭제가 가능하다. 질문자와 답변자가 모두 같은 경우에만 질문 삭제가 가능하다. 질문자와 답변자가 다른 답변이 하나라도 있으면 질문을 삭제할 수 없다. 위 요구사항을 만족하는 컨트롤러를 구현한 코드를 살펴보자. 모바일을 지원하는 DeleteQuestion컨트롤러이다. JsonView를 반환한다. public class ApIDeleteQuestionController extends AbstractController .. 2023. 4. 1.
[Servlet-jsp] DAO(Data Access Object)에서 데이터베이스 접근 로직을 구현할 때 사용하는 JdbcTemplate를 싱글톤 패턴으로 구현하기 매번 JdbcTemplate 인스턴스 생성하 컨트롤러에서 접급하는 DAO 클래스와 같이 데이터베이스 접근 로직을 구현할 때 사용하는 JdbcTemplate는 인스턴스를 여러개 필요가 없다. 인스턴스를 하나만 구현해도 된다. 우선, 개선하기 전 아래 코드를 살펴보자. public class JdbcTemplate { public void update(String sql, PreparedStatementSetter pss) throws DataAccessException { [생략..] } public void update(String sql, Object... parameters) { [생략..] } public void update(PreparedStatementCreator psc, KeyHolder .. 2023. 3. 31.
[Servlet-jsp] 스택과 힙 메모리 / 멀티쓰레드 상황에서 문제가 발생할 가능성이 있는 Controller의 코드 인스턴스 생성에 따른 비용 발생 매번 클래스의 인스턴스를 생성할 때는 비용이 발생한다. 인스턴스를 생성하고 더 이상 사용하지 않을 경우 가비지 콜렉션 과정을 통해 메모리에서 해제하는 과정 또한 비용이 발생한다. 따라서 인스턴스를 매번 생성할 필요가 없는 경우 매번 인스턴스를 생성하지 않는 것이 성능 측면에서 더 유리하다. 예를 들어, 모델 데이터를 담고있는 DTO(Data Transfer Object)는 클라이언트마다 서로 다른 상태 값을 가진다. 이 경우에는 매 요청마다 인스턴스를 생성해야 한다. 하지만 JdbcTemplate, DAO(Data Access Object), Controller 인스턴스를 매 요청마다 생성해야 할까? 아니다. 인스턴스 하나를 생성한 후 재사용할 수 있다. 서블릿은 서블릿 .. 2023. 3. 31.