분류 전체보기
Spring Boot CORS 설정하기
Spring Boot CORS 설정하기
2023.02.11CORS 란? Cross-Origin Resource Sharing, CORS 다른 출처의 자원을 공유할 수 있도록 설정하는것을 말합니다. CORS를 제대로 설정하지 않으면 원하는 리소스를 공유받지 못한다. CORS 문제를 Spring으로 해결하는 방법을 체크해본다. Configuration 해결하기 addMapping registry.addMapping 을 이용해서 CORS를 적용할 URL패턴을 정의할 수 있다. 아래처럼 "/**" 와일드 카드를 사용할 수 있다. @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { regi..
Spring Boot AOP
Spring Boot AOP
2023.02.11AOP란? AOP는 Aspect Oriented Programming 즉, 관점 지향 프로그래밍의 약어이다. 여러 클래스에 나눠져 있는 책임을 Aspect 로 캡슐화하는 접근 방식이다. AOP는 로깅, 트랜잭션, 보안, 인증, 캐싱 공통적인 로직이 요구된다. 이러한 공통의 로직을 횡단 관심사(cross-cutting concern) 라고 부른다. 공통 로직을 애플리케이션, 비즈니스, 데이터 계층에서 구현하게 되면 코드 유지관리가 어렵게 된다. AOP 주요 용어 Aspect: 흩어진 관심사를 모듈화 하는 것, 부가기능을 모듈화 한다. Target: Aspect를 적용되는 곳 Advice: 실질적으로 어떤 일을 해야하는지 적어놓은것, 부가기능을 담은 구현체다. JointPoint: Advice가 적용될 위치..
Spring Bean
Spring Bean
2023.02.04Spring Bean 이란? Spring IoC 컨테이너가 관리하는 자바 객체를 Bean 이라고 한다. 즉, Spring에 의해서 생성되고 관리되는 자바 객체라고 한다. Spring Container Spring Container를 구성하는 ApplicationContext 다형성으로 구현된다. 여기에서 ApplicationContext가 인터페이스이고 AnnotationConfigApplicationContext 구현체가 된다. 만약에, 빈에 대한 설정정보를 AppConfig.class 에 등록해두면 이 정보를 보고 객체 생성을 하게 된다. 스프링 컨테이너는 (빈 이름 | 빈 객체)로 등록된다. 이러한 동적인 의존관계를 스프링이 설정해준다. ApplicationContext applicationCont..
Criteria API
Criteria API
2023.01.28Criteria API란? 자바 ORM 표준 JPA 프로그래밍에서 JPQL(객체지향쿼리) Java Persistence Query Language 을 자바 코드로 작성할 수 있도록 도와주는 빌더 클래스 API를 의미합니다. JPQL 조회를 위한 문자열 빌드에 하나의 대안으로 Java 오브젝트를 갖는 조회 빌드 API 입니다. JPQL은 런타임 중에 잘못된것이 있는지 확인해볼 수 있습니다. Criteria API 장단점 장점 빌더 클래스로 컴파일 단계에서 문법 오류를 확인해볼 수 있습니다. 쿼리문을 문자열 그대로 작성 시 발생할 수 있는 휴먼 에러를 방지할 수 있습니다. 단점 코드가 복잡해지면 가독성이 떨어지게 됩니다. API 사용에 대한 러닝커브가 존재합니다. Criteria API 기본 쿼리 Crite..
의존성 주입
의존성 주입
2023.01.21의존성 주입이 필요한 이유 의존성 주입이 필요한 이유는 객체 간에 결합도를 줄일 수 있기 때문이다. 의존성 주입 방법 스프링에서 의존성 주입(DI)을 위한 4가지 방법을 제공한다. 생성자 주입 Setter 주입 필드 주입 메서드 주입 1. 생성자 주입 생성자를 통해 의존 관계를 주입할 수 있는 방법이다. 이 방법은 생성자 호출시점에서 1번만 호출되는것이 보장된다. 불변인 상태에서 사용할 수 있다. @Component public class quackServiceImpl implements diService { private final QuackRepository quackRepository; @Autowired public quackServiceImpl(QuackRepository quackReposit..
Spring JPA 와 Transaction
Spring JPA 와 Transaction
2023.01.13시작 Spring JPA로 CRUD를 사용하는 경우 Repository 메소드를 이용하게 될텐데 기본적으로 @Transaction이 적용되어 있다. Spring에서 트랜잭션 처리를 지원해서 어노테이션 방식으로 @Transactional로 선언하여 사용할 수 있다. 이번 포스팅에서는 Transaction에 대해 알아보고 Spring에서 어떻게 사용할 수 있는지 정리해보았다. Transaction 설정하기 Transaction 설정하는 방법에는 크게 3가지 방법이 있다. 1. Spring 3.1부터 @EnableTransactionManagement 어노테이션을 이용해 @Configuration이 붙은 클래스에 트랜잭션 설정이 가능한 방법이 있다. @Configuration @EnableTransaction..
카프카 스터디를 시작하며
카프카 스터디를 시작하며
2022.12.03카프카 스터디를 시작하게 되었습니다. 데이터가 많이 들어오다 보니 자연스럽게 카프카로 애플리케이션간 데이터를 스트리밍형 ETL을 처리하게 되는것 같습니다. 그래서 시작하게된 스터디... 위 책 내용으로 정리해보면서 잘 몰랐던 개념들을 기록해두려고 합니다. 카프카의 모습 카프카는 어떤 모델인지 알아보면 기존에 시스템들은 Target 애플리케이션과 Source 애플리케이션 사이에 파이프라인이 많이 생기게 되면서 한쪽이 장애가 발생하게 되면 다른 한쪽의 애플리케이션에도 영향을 미칠 수 있게 되었습니다. 그래서 아파치 카프카를 도입하게 됩니다. 아파치 카프카가 일종에 중앙에서 데이터를 처리해주는 역할을 하는것 같습니다. 자료구조의 큐를 살펴보면 First In First Out 자료구조로 동작하게 됩니다. 데이..
모던 자바 인 액션 reduce
모던 자바 인 액션 reduce
2022.06.06stream 과 parallel stream 차이 (Java 8) - A parallel stream has a much higher overhead to a sequential one. https://stackoverflow.com/questions/20375176/should-i-always-use-a-parallel-stream-when-possible?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa Should I always use a parallel stream when possible? With Java 8 and lambdas it's easy to iterate over collections as strea..
백기선 자바 스터디 1 - 과제
백기선 자바 스터디 1 - 과제
2022.02.14JVM이란 무엇인가 Java Virtual Machine에 약어이다. JVM의 역할은 자바 애플리케이션을 클래스 로더를 통해 읽어 들여 자바 API와 함께 실행하는것을 의미한다. 컴파일 하는 방법 개발자가 자바 소스코드(.java)를 작성한다. 자바 컴파일러가 자바 소스파일을 컴파일 한다. 이때 나오는 자바 바이트 코드(.class) 파일은 아직 컴퓨터가 읽을 수 없다. 컴파일한 바이트 코드를 JVM 클래스 로더에게 전달한다. 클래스 로더는 동적로딩을 통해서 필요한 클래스를 로딩 및 링크 해서 JVM의 메모리 영역에 올린다. 실행엔진이 JVM 메모리에 올라온 바이트 코드들을 명령어 단위로 하나씩 가져와서 실행한다. 실행하는 방법 java -jar [file-name].jar 로 실행한다. 바이트코드란 무..
넥스트스텝 - 레이싱 카 2단계
넥스트스텝 - 레이싱 카 2단계
2022.01.30개요 기존 1단계에서 MVC 패턴으로 구조화하는 작업을 진행한다. 데이터를 전달할 때는 DTO를 이용한다. 프로젝트 구조 객체 InputDTO 입력과 파싱에 대한 필드를 저장한다. OutputDTO 출력과 관련된 필드 및 메소드가 작성되어 있다. CarMoveBehavior 전략 패턴을 사용한다. 여기에는 몇 가지 이유가 존재하는데 테스트 코드 작성 시 랜덤 넘버를 받기 때문에 테스트 코드 작성 시 어려움을 갖는다. 코드의 유지보수가 좋아진다. Cars Cars 객체의 목적은 Car 객체를 Wrapping 하기 때문에 일급컬렉션으로서 역할이 충분하다고 생각한다. 그 외 기능은 필요하지 않다. FixNumberBehavior 무조건 갈 수 있다. RandomNumberBehavior 랜덤 넘버 제너레이트 ..
넥스트스텝 - 레이싱 카 1단계
넥스트스텝 - 레이싱 카 1단계
2022.01.29개요 계산기 미션 다음에는 레이싱카 미션이다. 총 2단계로 구성되어 있으며, 1단계에서는 페어 프로그래밍을 2단계에서 MVC로 구조 전환을 수행하는것이다. 프로그램은 다음 플로우로 흘러간다. 1. 자동차, 횟수 입력한다. 2. 랜덤 넘버를 받아와서 4이상이면 전진할 수 있다. 단, 전진하는 경우 상태값을 콘솔에 출력한다. 3. 가장 많이 전진한 자동차를 우승자로 선정한다. 우승자는 복수가 될 수 있다. 프로젝트 구조 프로젝트 구조에서도 조금 아쉬운것은 domain package에 많은 객체가 포함되어 있다. 굳이 쪼갠다면 entity pacakge 정도 하나 더 둘 수 있을것 같다. Helper 클래스는 Racing 클래스 쪽으로 합칠 수 있을것 같다. 관련 비즈니스 로직이 명확하게 domain pack..
넥스트스텝 - 계산기 리뷰
넥스트스텝 - 계산기 리뷰
2022.01.29프로젝트 구조 제출한 프로젝트 구조이다. 2주차인 지금 회고해 보니 common package 대신 utils package 를 쓰는것 그리고 view package 에서 InputView, OutputView 를 만들어서 관리해주는것이 좋지 않았을까 생각이 든다. 추가로 Validation 패키지를 관리하면 좋지 않을까 생각했다. 객체 ErrorMessage 상수 메시지에 대한 책임을 가지고 있다. 일관된 [ERROR] 표시가 맘에든다. UserInput 대충 보아도 UserInput에 부여되는 책임이 너무 많다. Parsing, Validation, SplitString, UserInput 이 주요 내용이다. 하나의 클래스에 하나의 책임을 부여하는것이 좋을것 같다. 만약, 변경한다면 아래를 클래스로 ..