본문 바로가기

전체 글376

[Java] 왜 DI(Dependency Injection)가 필요한가? 의존관계(Dependency)에 대해서 DI에 대해 이야기 하기 전에 먼저 의존관계에 대해서 알아봐야한다. 객체에게 의존관계란 무엇인가? 어느 순간 의존관계가 발생하는가? 의존관계란 객체 혼자 모든 일을 처리하기 힘들기 때문에 내가 해야 할 작업을 다른 객체에게 위임하면서 발생한다. 즉, 내가 가지고 있는 책임과 역할을 다른 객체에 위임하는 순간 발생하는 것이다. 예를 들면, Service 클래스와 DAO(Repository) 클래스가 있다고 가정해보자. Service 클래스에서 하나의 기능을 구현하기 위해 DAO 클래스에게 데이터베이스 접근 로직을 위임하고 있다. 이때, Service 클래스는 작업(기능구현)을 완료하기 위해 DAO 클래스에게 의존하고 있다면, 이는 의존관계를 가지고 있는 것이다. DI.. 2023. 4. 10.
[MySQL] LIKE 연산자를 활용한 쿼리 최적화 LIKE 연산자는 인덱스를 이용해 질의할 수 있다. DBMS에서는 단순한 문자열 패턴 비교 연산자로 LIKE 연산자를 REGEXP 연산자보다 더 많이 사용한다. REGEXP 연산자는 인덱스를 전혀 사용하지 못한다는 단점이 있지만, LIKE 연산자는 인덱스를 이용해 처리할 수 있다. LIKE 연산자는 정규 표현식을 검사하는 것이 아니라, 어떤 상수 문자열이 있는지 없는지 정도를 판단하는 연산자다. LIKE 연산자는 와일드카드 문자인(&, _) 가 검색어의 뒤쪽에 있다면 인덱스 레인지 스캔으로 사용할 수 있지만, 와일드카드가 검색어의 앞쪽에 있다면 인덱스 레인지 스캔을 사용할 수 없으므로 주의해서 사용해야 한다. B-Tree 인덱스를 이용한 검색은 100% 일치 또는 값의 앞부분(Left-most part).. 2023. 4. 7.
[Linux] 쉘 스크립트를 활용한 배포 자동화 해당 학습을 통해 단순히 톰캣 서버에 소스코드를 배포하는 경험에서 한발 더 나아가 수동으로 배포하던 작업을 쉘 스크립트를 활용해 배포를 자동화하는 과정까지 진행한다. 톰캣 서버 설치 Tomcat 8.0.x 버전을 다운로드 https://tomcat.apache.org/ 톰캣의 기본 포트는 8080이며, 포트 변경은 TOMCAT_HOME/conf/server.xml 파일에서 설정 변경 TOMCAT_HOME/bin/startup.sh 를 실행해 서버 시작 후 서버 정상 실행 확인 접속이 되지 않을 경우 톰캣 서버의 포트에 대한 방화벽 해제를 확인 # 1. 일반 사용자 권한에서 방화벽 해제가 불가함으로, ROOT 사용자로 변경 후 방화벽을 제거할 것 su - # 1-1 비밀번호 설정이 안되있을 경우 아래 명령.. 2023. 4. 7.
[CS] Network Connection : Bridged와 NAT의 차이 Network Connection 설정 원격 서버에 톰캣 서버를 배포하려고 했다. 그전에, Virtual Machine Settings에서 Bridged로 설정했을때는 원격 서버에서 문제가 없었으나, putty를 사용해서 원격으로 접속하려고 했을때는 에러가 계속해서 발생했다. 따라서, 우선 Bridged 방식과 NAT 방식의 차이에 대해서만 알고 넘어가고자 한다. (참고한 블로그이다. https://m.blog.naver.com/a5341663/221764145616 ) Bridged: 물리적인 네트워크 인터페이스(랜선 등)에 연결되어 있어야 한다 문제는, Bridged 방식은 VM이 물리적인 네트워크 인터페이스에 직접 연결되어 있을때 사용하는 방식이다. 이는 랜선을 사용하여 호스트 컴퓨터와 물리적인 네.. 2023. 4. 6.
[BaekJoon] 백준 알고리즘 2470번 / 두 용액 / 투포인터 / Python 문제 접근방법 투 포인터를 이용하여 효율적으로 용액을 선택해나가며 최적해를 찾는 알고리즘이다. 먼저 용액을 오름차순으로 정렬한 후 시작점 start와 끝점 end를 지정하고 두 용액의 합인 mix를 계산한다. 그리고 두 용액의 합의 절댓값이 더 작은 경우 ans와 res를 업데이트한다. 그리고 mix가 0보다 작으면 start를 증가시켜 더 큰 용액을 선택하고, 0보다 크면 end를 감소시켜 더 작은 용액을 선택한다. mix가 0이면 루프를 종료한다. 코드 """ 1. 아이디어 1) N(전체 용액 수)를 입력받아서 sort()를 통해 오름차순으로 정렬 2) for문에서 포인터(start, end)를 이동시키며 최적값(용액 합 0) 도출 2. 시간복잡도 - N(전체 용액 수)는 최대 100,000 이다. .. 2023. 4. 5.
[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.