전체 글 123

[Spring+JPA] 간단 노트 정리

`@SpringBootApplication`가 존재하는 패키지 및 하위 패키지 모두를 스캔하여 빈으로 올린 후 실행한다. Spring이 Repository의 `@PersistenceContext` 어노테이션을 확인하고 자동으로 EntityManager를 생성 후 주입시켜준다. 원래 JPA를 쓰려면 팩토리에서 직접 EntityManager를 꺼내 써야 하지만 Spring이 이를 자동화해준다. 만약 팩토리를 주입받고 싶다면 다음과 같이 `@PersistenceUnit` 어노테이션을 사용하면 된다. @PersistenceUnit private EntityManagerFactory emf; Spring Data JPA가 `@PersistenceContext` 대신 `@Autowired`만 사용해도 자동 주입을 ..

Web Dev/Spring 2023.03.17

[JPA] 도메인 설계 정리

초보 개발자의 객체 지향에 대한 실수 회원과 주문의 관계에서 사람의 생각으로 회원을 통해서 주문을 생성한다고 생각할 수 있는데 시스템은 이 둘 엔티티를 동급으로 놓고 생각해야하기 때문에 주문을 생성할 때 회원이 필요하다고 생각하는게 맞다. 어떤 회원의 주문 기록이 필요하다면 회원에 접근하여 주문을 찾는게 아니라 주문에서 회원의 조건을 걸고 찾는 것이다. 연관관계의 주인 만약 회원과 주문에 일대다,다대일의 양방향 관계를 가진다면(실제로는 회원에 주문 컬렉션이 필요가 없다.) 양방향 관계의 주인을 정해야하는데 주문이 '다'를 담당하여 복수의 갯수를 가지므로 연관관계에서 주인으로 정하는 것이 좋다. 보통 관계형 데이터베이스에서는 연관관계의 주인인 주문이 외래 키를 가지게 된다. 연관관계 주인 쪽에 실제 값을..

Web Dev/Spring 2023.03.14

[Spring] 스프링 빈 충돌 이슈 관리

스프링에서 빈들을 관리할 때 객체지향의 다형성이라는 특징을 이용하여 애플리케이션의 유연함을 늘리게 된다. 이 때 개발자는 의존 주입을 하기 위해 하위 타입의 객체를 만들게 되는데 이 때 단순히 타입을 입력하여 자동 주입을 받게 되면 상위 타입에 매칭되는 빈들 중에서 어떤 빈을 사용해야하는지 혼동이 와 충돌이 생길 가능성이 있다. 이를 해결하기 위해서는 스프링에서 어떻게 관리해주어야 하는지 알아보자. 스프링에서 빈 조회가 2개 이상 되는 문제를 해결하기 위한 방법은 다음과 같은데 하나씩 알아보자. @Autowired 필드 명 매칭 @Qualifier -> @Qualifier끼리 매칭 -> 빈 이름 매칭 @Primary 사용 @Autowired 필드 명 매칭 Autowired로 자동주입 받을 때 스프링은 다..

Web Dev/Spring 2023.03.12

[JAVA] 스트림(Stream) - 가공

자바 스트림이 생성되었다면 다음과 같은 중간 처리 혹은 가공 과정을 통해 우리가 원하는 결과값을 도출해내야 한다. 이 작업은 다시 Stream을 리턴하므로 여러 작업을 붙여(chaining) 복합적으로 사용할 수 있다. filter peek map sorted 위의 대표적인 처리 과정들을 하나씩 알아보자. Filter Filter 메소드는 스트림 요소(Collection)들을 필터링하기 위해 사용된다. 내부적으로는 Predicate를 사용하고 있으며 True 혹은 False로 리턴되는 조건을 입력하므로써 여과시켜주는 기능을 한다. ArrayList alphabet = new ArrayList(Arrays.asList("a", "b", "c")); alphabet.stream() .filter("b"::e..

Language/Java 2023.03.10

TroubleShooting: warning: unknown enum constant When.MAYBE

TroubleShooting 발생한 문제 의존 관계 주입 관련 테스트를 진행하다가 Spring console에서 평소에는 보지 못한 warning이 보여 찾아보았다. 해결 및 시도 방법 1. 구글링 -> @Nullable 이 열거형을 사용하는데 자동으로 사용하도록 되어있지 않아서 뜨는 문제라고 함. https://stackoverflow.com/questions/53326271/spring-nullable-annotation-generates-unknown-enum-constant-warning Spring nullable annotation generates unknown enum constant warning In my app, whenever I add @Nullable (which imports ..

Troubleshooting 2023.03.10

[JAVA] 스트림(Stream)

스트림(Stream)은 Java 8 버전에서 추가된 기능으로 람다를 활용할 수 있는 기능을 말한다. 기존에는 배열과 컬렉션 프레임워크를 다루기 위하여 for문과 foreach 등을 이용했지만 스트림이 추가됨으로써 배열과 컬렉션을 조합하여 원하는 결과를 바로 얻을 수 있다. 함수형 프로그래밍이기 때문에 비교적 간결하고 가독성이 좋아진다는 특징이 있고, 쉬운 병렬 처리를 수행할 수 있다. 또한, 최근 부각되고 있는 reactive programming에서 사용되는 reactor를 잘 사용하기 위해 스트림에 대한 이해가 필요하기 때문에 중요하다고 할 수 있다. 여기서 Reactor는 Reactive Streams 명세를 기반으로 하는 non-blocking 앱을 개발하기 위한 자바 라이브러리를 말한다.(Spr..

Language/Java 2023.03.03

[HTTP 웹] 9. HTTP 헤더 - 캐시와 조건부 요청

캐시 캐시(cache, 문화어: 캐쉬, 고속완충기, 고속완충기억기)는 컴퓨터 과학에서 데이터나 값을 미리 복사해 놓는 임시 장소를 가리킨다. 캐시는 캐시의 접근 시간에 비해 원래 데이터를 접근하는 시간이 오래 걸리는 경우나 값을 다시 계산하는 시간을 절약하고 싶은 경우에 사용한다. 캐시에 데이터를 미리 복사해 놓으면 계산이나 접근 시간없이 더 빠른 속도로 데이터에 접근할 수 있다. 캐시는 시스템의 효율성을 위해 여러 분야에서 두루 쓰이고 있다. 웹 개발에서의 캐시는 주로 서버에서 반복적으로 동일한 요청을 받아서 결과를 돌려주어야 할 때(이미지, 썸네일 등)나 접근 시간에 비해 원래 데이터에 접근하는 시간이 오래걸리는 경우에 사용을 하게 된다. 혹은 Web Client Cache처럼 클라이언트의 웹 브라우..

[HTTP 웹] 8. HTTP 헤더 - 옵션 종류

header에 사용할 수 있는 또한 사용해야 하는 다양한 옵션들을 알아보자! 전송 방식 전송 방식에는 단순 전송, 압축 전송, 분할 전송, 범위 전송 이렇게 4가지가 존재한다. 단순전송 컨텐트의 길이를 정확히 알 때 전체를 단순하게 보내는 전송이다. 압축전송 서버에서 gzip과 같은 방식으로 압축하여 보내는 전송이다. 실제로 유의미한 압축률을 보이게 된다. header에 `Content-Encoding: gzip` 과 같이 압축 방식을 함께 전송해야 한다. 분할전송 `Transfer-Encoding: chunked` 옵션을 사용하여 분할하여 전송하게 된다. 분할 전송 때에는 길이를 가늠할 수 없기 때문에 Content-Length를 표기하지 않는다. 범위전송 `Range: bytes=1001-2000`처..

[HTTP 웹] 7. HTTP 헤더

HTTP 헤더 HTTP 헤더는 HTTP 전송에 필요한 모든 부가정보(메시지 바디의 내용, 메시지 바디의 크기, 압축, 인증, 요청 클라이언트, 서버 정보, 캐시 관리 정보...)를 포함한다. 표준헤더의 종류는 상당히 많으며 필요시 임의의 헤더를 추가 가능하다. HTTP 헤더 형식 Content-Type: application/json header-field = field-name":" OWS field-value OWS (OWS:띄어쓰기 허용) HTTP 헤더 분류 - RFC2616(과거) 과거에는 HTTP 헤더가 크게 다음과 같이 분리되어 있었다. General 헤더: 메시지 전체에 적용되는 정보 ex) Connection: close Request 헤더: 요청 정보 ex) User-Agent: Mozi..

[HTTP 웹] 6. HTTP 상태 코드

HTTP 상태코드 HTTP 상태코드란 클라이언트가 서버로 보낸 요청의 처리가 잘 진행 되었는지를 응답에서 알려주는 기능을 말한다. 상태 코드는 100~500번대 까지 존재하며 각 100번 대마다 가지는 의미는 다음과 같다. 1xx (Informational): 요청이 수신되어 처리중 2xx (Successful): 요청 정상 처리 3xx (Redirection): 요청을 완료하려면 추가 행동이 필요 4xx (Client Error): 클라이언트 오류, 잘못된 문법 등으로 서버가 요청을 수행할 수 없음 5xx (Server Error): 서버 오류, 서버가 정상 요청을 처리하지 못함 그런데 만약 위의 상태코드 이외의 299와 같은 새로운 코드가 나타나면 어떻게 할까? 미래에서 새로운 상태 코드가 추가 되더..