Spring
[Spring] 동적 프록시 기술
[Spring] 동적 프록시 기술
2023.07.23JDK 동적 프록시 기술이나 CGLIB 같은 프록시 생성 기술을 활용하면 프록시 객체를 동적으로 만들 수 있다. 이전처럼 프록시 객체를 계속해서 만들지 않고 하나만 만들고 동적 프록시로 적용해보자. 자바의 리플렉션 기술을 사용하면 클래스나 메서드의 메타데이터를 동적으로 획득하고 코드도 호출할 수 있다. @Slf4j static class Hello { public String callA() { log.info("callA"); return "A"; } public String callB() { log.info("callB"); return "B"; } } @Test void reflection1() throws Exception { Class classHello = Class.forName("hello...
[Spring] 프록시 패턴과 데코레이터 패턴
[Spring] 프록시 패턴과 데코레이터 패턴
2023.07.22메서드 실행 단위로 로그를 출력할 때 템플릿 메서드 패턴과 전략 패턴을 사용했지만, 기존 코드를 수정해야 한다는 문제점이 남아있다. 프록시를 사용하면 해당 문제를 해결할 수 있다. 네트워크에서의 프록시는 클라이언트와 서버 사이에서 중개자 역할을 수행한다. 클라이언트는 직접 서버와 통신하는 대신 프록시 서버를 통해서 실제 서버에 요청을 보내고, 프록시 서버는 해당 요청을 받아 실제 서버에 전달한다. 1. 캐싱 : 자주 요청되는 리소스를 캐시로 저장해 클라이언트에게 더 빠르게 응답한다. 2. 필터링 : 특정 서비스에 대한 접근을 차단하거나 제한한다. 3. 로드밸런싱 : 프록시 서버가 요청을 여러 서버에 분산시켜 서버 부하를 줄인다. 4. 보안 : 클라이언트의 실제 IP주소를 숨시고 프록시 IP주소를 사용해 ..
[Spring] 템플릿 메서드 패턴과 전략 패턴
[Spring] 템플릿 메서드 패턴과 전략 패턴
2023.07.19템플릿 메서드 패턴은 변하는 부분과 변하지 않는 부분을 분리하기 위해 사용되는 디자인 패턴이다. 하나의 메서드는 비즈니스 로직을 실행하는 부분과 비즈니스 로직의 실행 시간을 측정하는 부분으로 구성된다. 여기서 핵심 기능은 비즈니스 로직을 실행하는 부분이고, 실행 시간을 측정하는 부분은 부가적인 기능이다. 핵심 기능과 부가 기능을 분리해보자. public abstract class AbstractTemplate { public void execute() { long startTime = System.currentTimeMillis(); call(); long endTime = System.currentTimeMillis(); long resultTime = endTime - startTime; log.in..
[Spring] 로그 추적기와 쓰레드 로컬
[Spring] 로그 추적기와 쓰레드 로컬
2023.07.16public 접근제어자가 붙은 모든 메서드가 실행될 때 마다 로그를 찍어보자. 로그는 애플리케이션 로직에 영향을 끼쳐서는 안되고, 각 HTTP 요청을 구분할 수 있어야 한다. @Slf4j public class FieldLogTrace implements LogTrace { private static final String START_PREFIX = "-->"; private static final String COMPLETE_PREFIX = "
[Spring Web MVC] 로그인 처리 - Filter / Interceptor
[Spring Web MVC] 로그인 처리 - Filter / Interceptor
2023.07.11로그인 한 사용자에 한해서만 웹 페이지가 제공하는 서비스를 사용할 수 있어야 한다. 로그인 하지 않은 사용자가 특정 URL으로 접속을 시도할 경우 로그인을 하지 않아도 서비스를 사용할 수 있으면 안 된다. 컨트롤러에서 로그인 여부를 체크하는 로직을 하나하나 추가해서 작성하는 방법도 있지만, 이렇게 설계하면 나중에 로그인 관련 로직이 변경될 때 작성된 로직을 모두 수정해야 하는 불편함이 생긴다. 여기서의 로그인처럼 여러 로직에서 공통으로 관심이 있는 작업을 공통 관심사라고 한다. 웹과 관련된 공통 관심사는 서블릿 필터 또는 스프링 인터셉터를 사용해 한 번에 처리할 수 있다. Servlet Filter 필터는 수문장 역할을 한다. HTTP 요청 -> 서버 -> 필터 -> 디스패처 서블릿 -> 컨트롤러 서버는..
[Spring Web MVC] 로그인 처리 - Cookie / Session
[Spring Web MVC] 로그인 처리 - Cookie / Session
2023.07.10패키지 구조를 먼저 설계하자. 도메인과 웹을 분리했는데, 도메인은 시스템이 구현하는 핵심 비즈니스 업무 영역을 말한다. 나중에 웹을 다른 기술로 변경한다고 해도 도메인은 그대로 유지할 수 있어야 한다. (도메인은 웹에 의존하지 않고, 웹은 도메인에 의존한다.) 도메인 : 비즈니스 로직 (서비스, 리포지토리, 모델, 엔티티) 웹 : HTTP 요청 처리하고 응답 (컨트롤러, 필터, 리스너) public Member login(String loginId, String password){ // Optional findMemberOptional = memberRepository.findByLoginId(loginId); // Member member = findMemberOptional.get(); // if(m..
[Spring Basic] IoC와 DI 구조
[Spring Basic] IoC와 DI 구조
2023.06.14변경이 쉬운 코드를 작성하기 위해 Properties클래스를 사용한다. 여기서 Properties는 key - value 쌍으로 값을 저장하고, 타입은 을 사용한다. Properties클래스는 load메서드를 사용해 파일의 값을 읽어오거나 저장할 때 편리하게 사용될 수 있다. AppContext클래스를 사용해 여러 객체를 저장하는 저장소를 구현한다. 내부적으로 Map 자료구조를 가지고 있어 키 값을 통해 객체의 value를 얻도록 설계돼있다. 스프링은 자바 객체들을 빈으로 관리하고, 필요할 때 주입해주는 컨테이너이다. JavaBeans 기술은 원래 프론트엔드에서 GUI를 다룰 때 사용되는 기술이였지만 JavaFx로 업데이트하면서 자바로 GUI부분을 잘 사용하지 않게 되고 서버를 다루는데에 JavaBean..
[Spring Basic] 웹 서버와 웹 애플리케이션 서버의 구조
[Spring Basic] 웹 서버와 웹 애플리케이션 서버의 구조
2023.06.14클라이언트는 서비스를 요청하고, 서버는 서비스를 제공한다. 쉽게 생각하면 클라이언트는 우리가 사용하는 컴퓨터, 클라이언트 애플리케이션은 브라우저라고 할 수 있고, 서버를 처리하는 컴퓨터를 서버 컴퓨터, Tomcat을 서버 애플리케이션이라고 할 수 있다. 하나의 서버 컴퓨터에 여러 가지 서버가 모여있으면, 클라이언트가 제공하는 IP주소만으로는 어떤 서버에 대한 요청인지 구분할 수 없다. 때문에 포트번호가 필요하다. 여기서 포트번호는 서버를 구분할 때 사용한다. 간단하게 네트워크에 연결된 애플리케이션의 프로세스나 서비스를 구분하기 위한 식별자라고 생각하면 된다. 따라서 클라이언트는 서버에게 요청할 때 포트번호를 포함해서 요청해야 한다. ex. 123.45.1234:8082 (아이피 : 포트번호) / 웹 서버..
[Spring Basic] 예외처리
[Spring Basic] 예외처리
2023.06.13예외가 발생하고 처리해 주지 않으면 내부 서버 오류인 500번대 오류로 처리한다. 여러 가지 메서드들에 대해서 같은 에러가 발생함을 예상한다면, 각각의 메서드에다 try-catch문을 작성하는 대신 @ExceptionHandler 애너테이션을 사용해 예외를 따로 빼서 처리해 줄 수 있다. 이 때, 매개변수로는 처리할 예외가 들어간다. @ExceptionHandler 애너테이션으로 특정 예외를 처리하는 메서드를 지정할 수 있다. 예외를 처리하는 메서드는 여러 개가 있을 수 있고, 에러가 처리될 때는 작은 에러부터 시작해서 처리된다. NullPointerException은 Exception클래스의 자손이니, NullPointerException에러 메서드가 있다면 해당하는 에러를 먼저 찾은 후 없다면 그 조..
[Spring 3.1] 스프링 MVC 애너테이션
[Spring 3.1] 스프링 MVC 애너테이션
2023.06.02@RequestMapping 스프링 MVC는 핸들러 매핑으로 메서드를 연결해준다. // 슬래시로 끝나지 않으면 hello.* hello/ 도 함께 매핑됨 @RequestMapping("/hello") public String hello() { ... } // @GetMapping을 이런식으로 구현 @RequestMapping(value = "/hello" method = RequestMethod.GET) public String hello() { ... } // 매핑에 요청 파라미터 지정 가능 @RequestMapping(value = "/hello" params="type=admin") public String hello() { ... } @RequestMapping(value = "/hello" pa..
[Spring Boot] 외부 설정
[Spring Boot] 외부 설정
2023.05.28개발한 애플리케이션을 실행할 때는 개발 / 로컬 / 운영 환경으로 나눠서 실행하고, 환경마다 사용하는 데이터베이스나 기타 설정을 다르게 설정한다. 변하는 환경 값들을 실행하는 시점에서 외부에서 넣어 주는 방식을 사용하는 편이 합리적이다. 대부분 애플리케이션 빌드는 한 번만 하고, 애플리케이션을 실행할 때 설정 정보를 외부에서 넣어 주는 방식을 사용한다. 외부 설정으로는 크게 4가지 방법이 있다. 1. OS 환경 변수 : 운영체제에서 제공하고, 해당 운영체제를 쓰는 모든 프로세스에서 사용된다. System.getenv() 메서드로 Map을 반환받고 OS가 제공하는 환경 변수를 출력할 수 있다. 데이터베이스 접근 URL을 OS의 환경 변수에 설정해두고 애플리케이션 실행 시 읽어들이는 방식을 사용할 수 있다...
[Spring Boot] 자동 구성
[Spring Boot] 자동 구성
2023.05.26DB에 회원을 저장하고 관리하려면 JdbcTemplate, DataSource, TransactionManager 등 데이터베이스 관련 여러 빈들이 사용된다. 스프링 부트는 자동 구성 기능을 사용해 자주 사용하는 빈들을 자동으로 등록해준다. spring-boot-autoconfigure 프로젝트 내부에서 자동 구성 관련 정보를 확인할 수 있다. (spring-boot-starter 라이브러리를 추가할 때 등록된다) @AutoConfiguration(after = DataSourceAutoConfiguration.class) @ConditionalOnClass({ DataSource.class, JdbcTemplate.class }) @ConditionalOnSingleCandidate(DataSource..