본문 바로가기

분류 전체보기510

스프링부트로 개발하는 MSA 컴포넌트 [7]장 스프링 AOP 와 테스트, 자동 설정 원리 스프링 프레임워크의 3가지 핵심 기술 스프링 AOP 관심사의 분리 대상객체 (target object) : 공통 모듈을 적용할 대상 ex) logging 공통모듈 / HotelDisplayService 대상 객체 관점 (aspect) : 어드바이스 + 포인트컷 어드바이스 (advice) : 공통 로직이 작성된 모듈 포인트컷 (point cut) : 적용할 위치 설정 조인포인트 (join point) : 어드바이스가 적용된 위치 프록시 객체 (proxy object) : 스프링 AOP는 기능을 조합하기 위해 동적으로 프록시객체를 만든다. 스프링 AOP 와 프록시 객체 스프링 AOP 프레임워크는 대상 객체를 감싸는 프록시 객체를 동적을 생성. 프록시 객체가 클라이언.. 2023. 8. 26.
스프링부트로 개발하는 MSA 컴포넌트 [5]장 스프링 MVC를 이용한 REST-API 개발 Jackson 라이브러리를 포함하고 있어, JSON 에 대한 처리에 대한 추가 설정이 필요없다. 명세에 필수/선택 여부가 반드시 정의되어야 한다. @ResponseBody → 스프링 MVC 의 View 를 사용하지 않는다. @RestController 를 사용하면, 응답값으로 리턴하는 객체는 마셜링된다. @RequestMappingHandlerMapping → @RequestMapping 으로 구현된 컨트롤러가 대상이면 사용, 사용자 요청과 핸들러를 매핑하는 정보를 관리 Controller 클래스 구현 스프링 빈으로 설정되어야 한다 @PathVariable @RequestParam @RequestHeader REST-API 응답 메시지 처리 엔티티 객체를 DT.. 2023. 8. 24.
@ConfigurationProperties / @ConfigurationPropertiesBean url: naver: www.naver.com depth: google: www.google.com yml 에 설정한 값들을 편리하게 사용할 수 있는 어노테이션입니다. 기존에 프로젝트에서 사용했던 방법은 2가지를 사용했습니다. 1. Enviroment 를 사용 2. 각각의 설정파일을 불러 객체로 만들어 사용 @ConfigurationProperties / @ConfigurationPropertiesBean 를 사용하게 되면 객체지향적으로 설정파일의 값을 사용할 수 있습니다. application.yml 을 간단히 설정했습니다. naver 처럼 첫 줄에 값을 설정할 수도 있지만, google 처럼 두번째 depth 로 사용하는 경우도 많습니다. url: naver: www.naver.com depth: g.. 2023. 8. 23.
[JAVA] 깊은 복사 vs 얕은 복사 깊은 복사 vs 얕은 복사 #Java 참고 : [Java] - 깊은 복사(Deep Copy) vs 얕은 복사(Shallow Copy) 깊은 복사 : ‘실제 값’을 새로운 메모리 공간에 복사하는 것 얕은 복사 : ‘주소 값’을 복사 → 참조하고 있는 실제값은 같다. Collection 은 clone() 이라는 메서드를 이용해서 얕은 복사를 만들 수 있다. 깊은 복사를 구현하는 방법은 여러가지 Cloneable 인터페이스 구현 복사 생성자 복사 팩터리 Cloneable 을 사용하지 말자. Cloneable 인터페이스는 복제해도 되는 클래스임을 명시하는 용도의 믹스인 인터페이스지만, 아쉽게도 의도한 목적을 제대로 이루지 못했다. 여기서 큰 문제점은 clone 메서드가 선언된 곳이 Cloneable이 아닌 OB.. 2023. 8. 20.
스프링부트로 개발하는 MSA 컴포넌트 [1~4]장 #book 스프링부트로 개발하는 MSA 컴포넌트 1장.마이크로 서비스 아키텍처 마이크로서비스 아키텍처는 기능 위주로 나뉜 여러 애플리케이션이 있고, 각각 독립된 데이터 저장소를 사용. 특징을 대표하는 키워드는 대규모 시스템, 분산처리 시스템, 시스템 확장 등. 서비스 지향 아키텍처와 관련이 많은데, 대규모 시스템을 설계할 때, 서비스 기능 단위로 시스템을 묶어 시스템 기능을 구현한 것을 의미. 각 마이크로서비스는 독립적으로 동작해야 하고, 다른 마이크로서비스에 의존을 최소화 해야 한다 → 느슨한 결합 기능과 성격에 맞게 잘 분리되어야 한다. 각 마이크로서비스 컴포넌트들은 기능을 연동할 때, API 를 통해 서로 데이터를 주고받는다. → API가 사용하는 네트워크 프로토콜이 성능 저하를 야기할 수 있으므로.. 2023. 8. 20.
Optional + orElse 와 orElseGet 메서드 비교 테스트 Optional 결과가 null 이 절대 나올 수 없을 경우에는 사용하지 않는다. Null 에 의해 오류가 발생할 가능성이 매우 높을때만 반환값으로 사용한다. Optional 의 값을 확인하지 않고 접근하면 NPE 대신 NoSuchElementException 이 발생할 수 있다. [ 올바른 Optional 사용법 가이드 ] Optional 변수에 Null을 할당하지 말아라 값이 없을 때 Optional.orElseX()로 기본 값을 반환하라 단순히 값을 얻으려는 목적으로만 Optional을 사용하지 마라 생성자, 수정자, 메소드 파라미터 등으로 Optional을 넘기지 마라 Collection의 경우 Optional이 아닌 빈 Collection을 사용하라 반환 타입으로만 사용하라 https://man.. 2023. 8. 15.
@Transactional 에 대해 @Transaction 스프링 프레임워크를 사용하면 보통 서비스 레이어(비즈니스로직) 에 @Transactional 어노테이션을 선언해 트랜잭션을 시작한다. 해당 어노테이션에 있으면, 메서드를 호출하기 직전에 스프링의 AOP 가 먼저 동작한다. 메서드가 시작하기 전 트랜잭션을 시작한다. 메서드가 정상적으로 종료되면 트랜잭션을 커밋하면서 종료한다. 트랜잭션을 커밋할 때, 플러시 하면서 DB에 저장하고 커밋한다. 만약, 예외가 발생하면 트랜잭션을 롤백하고 종료한다 ( 커밋은 발생 X ) + 기본적으로 Unchecked Exception, Error 만을 롤백한다. 트랜잭션이란? 데이터베이스의 상태를 변경하는 작업 또는 한번에 수행되어야 하는 연산 Begin , commit 을 자동으로 수행 예외 발생 시, .. 2023. 8. 15.
동적 프록시란 ? 먼저, Spring Boot 2.0 이상부터 CGLIB 가 기본으로 적용되어 사용되고 있다. Spring AOP 에는 JDK proxy 를 기본으로 사용한다. 단, 인터페이스가 없는 경우에는 CGLIB 을 사용한다. CGLIB 을 디폴트로 사용하고 있는 이유는 인터페이스 기반의 프록시 ( JDK proxy ) 는 때때로, ClassCast Exceptions 를 추적하기 어렵다고 한다. ( 단순히 생각해도, 인터페이스보다 구현하고 있는 클래스를 기반으로 프록시를 만드는 것이 더 정확할 것. ) Spring AOP 는 기본적으로 프록시 방식을 사용한다. 프록시는 객체를 직접적으로 참조하는게 아닌, 해당 객체를 대신하는 객체를 통해 객체에 접근하는 방식. 프록시 객체없이 타겟에 접근하게 되면, 직접 호출하는.. 2023. 8. 11.
Java Bean / POJO / Spring Bean 간단 설명 Java Bean 과 POJO , Spring Bean 의 차이점에 대해 간단히 알아보겠습니다. 1. Java Bean 은 옛날 EJB 로 개발하는 시절에 중요했던 개념입니다. 현재는 EJB 로 개발하는 일은 많이 없다고 합니다. Java Bean 은 3가지 제약사항이 있습니다. - default 생성자는 public 이어야 하며, 파라미터가 없어야 합니다. - 클래스의 속성에 접근할 수 있는 getter / setter 가 있어야 합니다. - 해당 클래스는 Serializable 을 implement 해야 합니다. 코드로 알아보면 아래와 같은 형태를 나타냅니다. import java.io.Serializable; public class JavaBean implements Serializable { pr.. 2023. 7. 29.