개발

· 개발
Accept 란? Accept 요청 HTTP 헤더는 MIME 타입으로 표현되는 클라이언트가 이해가 가능한 컨텐츠 타입이 무엇인지 알려줍니다. 참조링크(mdn) 즉, 클라이언트에서 Accept header에 타입을 서버에게 알려줌로써 서버에게 나 이러한 타입의 응답을 받을수 있어 라는 것을 알려줍니다. 그러면, Spring 같은 프레임워크에서는 Accept의 값에 의해서 적절한 응답에 대한 MessageConverter을 선택해서 전달해주지 않을까?라는 의문이 발생했고 코드로 따라가 보자. Spring에서의 Accept 처리 1. RequestResponseBodyMethodProcessor.class -> handleReturnValue RequestResponseBodyMethodProcessor.cl..
· 개발
트랜잭션이란? 트랜잭션은 데이터베이스의 상태를 변화시키기 위해 수행하는 작업의 단위. 하나의 트랜잭션은 여러 개의 연산을 포함. 이때, 모두 성공적으로 완료됨 (Commit), 아니면 전혀 실행되지 않아야 함 (Rollback) - 데이터 일관성, 무결성을 유지하기 위해서 선언적인 트랜잭션 관리 선언적인 트랜잭션 관리란? 트랜잭션을 처리하는 코드를 직접 작성하지 않고, 어노테이션이나 XML을 통해 경계를 설정하는 것 이로써, 개발자는 트랜잭션 관리 로직에 신경 쓸 필요 없이 비지니스 로직에 집중할 수 있다. @Transactional @Target({ElementType.TYPE, ElementType.METHOD})으로 선언되어 있어 클래스, 메서드 영역에 작성한다. @Retention(Retentio..
· 개발
사내에 개발 표준을 수립할 때 정리한 레이어드 아키텍처에 대해서 정리하고자 합니다. 그중 4계층형 아키텍처에 대해서 정리합니다. 1. 레이어드 (계층형) 아키텍처란? 시스템을 각 관심사를 기준으로 계층으로 분리하여, 각 계층의 특정한 책임을 가지고 상호 작용하도록 구성하는 방식 2. 레이어드 아키텍처의 특징 각 레이어는 독립적인 모듈로 구성합니다. 각 계층은 고유한 관심사를 가지고 있으며 시스템의 복잡성을 줄여 줄 수 있습니다. 하위 레이어는 상위 레이어를 의존하지 않습니다. 3. 4계층 아키텍처 User Interface Layer (UI Layer) 사용자와 시스템(애플리케이션)간의 상호작용 (연결)을 하기 위한 레이어 EX) ApprovalController // ApprovalResponse @G..
설정 파일 위치 CLI 자격증명 파일 ~/.aws/credentials CLI 설정 파일 ~/.aws/config 우선순위는 CLI 자격 증명 파일이 우선 순위가 높습니다. 커멘드 라인으로 변경하는 방법 AWS CLI 사용하기 공식문서 https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/cli-configure-files.html#cli-configure-files-format-profile 어카운트 리스트 (어카운트 리스트 조회) aws configure list 어카운트 리스트 이름만 조회 aws configure list-profiles 환경 변수로 변경하기 export AWS_PROFILE=user1 AWS Toolkit 으로 변경 하는 방법 인텔리제..
· 개발/JAVA
관련 글은 Spring Event의 동작을 한번 소스를 까면서 동작을 이해하는 과정을 다룹니다. Spring Event 동작 흐름은 어떻게 될까? ApplicationEventPulisher의 이벤트를 발행 -> ApplicationEventMulticaster에 의해 구독(모니터링)된 이벤트 리스너들을 호출하게 됩니다. 동작 흐름을 코드로 따라가 보자 1. ApplicationEventPulisher에 이벤트를 발행 2. ApplicationEventPulisher에서 옵저버 역할을 하는 ApplicationEventMulticaster에 일을 시킵니다. 3. ApplicationEventMulticaster (구현체 SimpleApplicationEventMulticaster) getApplicati..
· 개발/JAVA
"Self Invocation"은 개념상으로는 자기 자신을 호출하는 것을 의미한다. AOP에서 Self Invocation 문제란? 객체 소속에 메서드에서 자기 자신의 메서드를 호출했을 때 AOP가 동작하지 않는 현상을 의미한다. 원인 Spring AOP는 프록시 기반으로 동작하게 됩니다. AOP 대상의 객체는 DI하게 될 때 실제 객체가 아닌 프록시 객체가 주입 되게 됩니다. 객체 내에서 해당 객체 메서드를 호출하게 되면 프록시 객체에 의해 호출되는 것이 아닌 직접호출로 이루어지게 되어 AOP가 동작하지 않게 됩니다. 예제 AOP 동작 시킬 어노테이션 @Retention(java.lang.annotation.RetentionPolicy.RUNTIME) public @interface AopGoGo { ..
TestFixture란? 테스트 코드에서 공유되는 초기 상태나 리소스를 설정하는 데 사용되는 개념 테스트 코드를 작성할 때마다 반복적으로 실행되는 코드를 줄이고, 테스트 코드의 가독성을 높이기 위해 사용 TestFixture 예시 public static Car 가격이_100000인_테슬라() { return Car.builder() .name("Tesla") .price(100000) .build(); } 사용 @Test @DisplayName("가격이_100000인_테슬라 주문 생성") void createOrder() { // given Car car = CarFixture.가격이_100000인_테슬라(); int quantity = 2; // when Order order = Order.build..
· 개발
Java 1.5에 java.util.concurrent패키지 도입하면서 비동기 작업을 편하게 작업 할 수 있겠다. ExecutorService ThreadPool을 이용하여 비동기 작업들의 관리 할 수 있는 클래스 Java 1.5 스펙 submit 메서드를 수행하여 비동기 작업을 조회하거나 제어 할수 있는 Future 클래스를 반환 ThreadPoolExecutor 와 Executors의 팩토리메서드를 통해서 초기화 가능 submit 비동기 작업들을 수행하는 메서드 ( Callable, Runnable )을 파라미터로 받아 수행한다. * Callable ( 반환 타입이 있는 함수형 인터페이스 Future의 반환 타입이된다.) * Runnable ( 반환 타입이 없는 함수형인터페이스 ) ExecutorSe..
· 개발
동기와 비동기는 2가지 이상의 작업을 할때 수행하는것이라는 아이디어를 기억해야한다. 동기 (Synchronous) 어원의 근원 Sync (동시에 일어나다, 수행시기를 맞추는것) chrono (시간) 동시에 일어나는 사건(작업)들의 시간을 맞추는 것을 의미 한다. 예시) A와 B라는 작업을 같은 시간에 작동하도록 맞춘다. A의 B라는 작업이 끝나면 다음 작업이 시작되도록 맞춘다. 밥을 먹고 난 후 커피를 마신다. 밥과 커피를 동시에 마신다. 비동기 (Asynchronous) 동시에 일어나는 작업들의 시간을 맞추지 않는것 예시 ) A의 작업과는 별개로 B를 단독적으로 수행한다. 밥을 먹는중에 커피도 같이 마신다. 참고 링크 : https://www.youtube.com/watch?v=HKlUvCv9hvA&t..
· 개발
제 3자에 대한 처리를 어떻게 할 것인가에 대한 관점이라고 생각이 된다. 내가 수행중인 작업중에 B의 작업을 수행할때 B의 작업을 기다릴꺼냐? 안기다릴꺼냐의 관점이다. B의 작업을 기다린다면 블록킹 안기다린다면 논 블록킹 블록킹 밥 먹기라는 작업을 끝날때 까지 기달렸다가 커피를 마신다. 논 블록 킹 밥먹기 라는 작업을 안기다리고 커피를 마신다
TestFixture란? 테스트 코드에서 공유되는 초기 상태나 리소스를 설정하는 데 사용되는 개념 테스트 코드를 작성할 때마다 반복적으로 실행되는 코드를 줄이고, 테스트 코드의 가독성을 높이기 위해 사용 첨언 특정 상태를 고정해놓고 편의상 TestFixture 메서드를 선언하고 활용한다. 개인적인 의견으로 한글 메서드를 쓰면 가독성이 좋을 것으로 판단. TestFixture 예시 public static Car 가격이_100000인_테슬라() { return Car.builder() .name("Tesla") .price(100000) .build(); } 사용 @Test @DisplayName("가격이_100000인_테슬라 주문 생성") void createOrder() { // given Car ca..
· 개발
지난 포스팅(https://benggrae.tistory.com/20)에서 Spring에서 API버전을 분기하는 방법에 대해서 작성하였다. 개인적인 생각에 Spring API Gateway를 이용하여 별도의 서비스(서버) 별로 쓰거나 새로운 버전이 통째로 런칭되어 하나의 서비스로도 떨어져 나갔을 때 유용한 방법이라고 생각이 되며 손쉽게 분기가 가능했다. YML에서 라우팅룰을 정의할 수 있다. application.yml 작성한다.spring: cloud: gateway: routes: URI에 버전을 포함시키는 방법 GET /v1yaml 파일 routes: - id: v1-api-path uri: http://localhost:8081 predicates: - Path=/v1/** filters: - R..
beng9re
'개발' 카테고리의 글 목록