개발을 하다보니 @Component 어노테이션을 많이 사용하게 되었다. 특히 팩토리 패턴에서는 팩토리 역할을 하는 객체 및 팩토리 객체에서 생성되는 객체들을 @Component 어노테이션을 붙여 빈 생성을 하게 되었다. 그러다보니 언뜻 들은 @Bean 어노테이션도 들었는데 빈을 생성하는데 @Bean과 @Component 어노테이션 둘의 차이 점은 무엇일까? 둘다 빈으로 등록되게 하고 관리되게 해주는 것이지만 살짝 차이 점이 있다. @Bean 외부 라이브러리 또는 이미 정의되어 있는 객체들이 서로 종속성을 가지고 있을 경우의 빈 등록에 사용하는 어노테이션이다. 반환 값이 바로 Bean으로 등록되는 것이다. 이미 정의된 기본 객체를 재정의하거나 내가 만든 객체의 종속성을 위해 빈을 등록할 때 사용한다. 즉,..
개발을 할 때 여러 가지 방법들이 있다. 그것을 디자인 패턴이라고 하는데 Factory Pattern(팩토리 패턴)도 그 디자인 패턴 중 하나이다. (여러 글들을 보면 어디는 디자인패턴이 아니라고 하고 어디는 디자인패턴이라고 하지만 일단 나는 디자인패턴이라고 생각하겠다.) Factory Pattern(팩토리 패턴)이란? 이름에 Factory(공장)이라는 이름이 들어간 패턴이라는 것을 보면 조금은 감이 올 수 있다. 하나의 공장에서 여러 제품을 만들어내듯이 공장 역할을 하는 객체에서 조건에 따라 분기를 해서 필요한 객체를 만들어내는 방식이 바로 팩토리 패턴이다. 하지만 공장에서 제품을 찍어내는 방식을 알다시피 옷을 만드는 공장에서 자동차를 만들어낼수는 없는 법이다. 즉, 공통점이 어느 정도 있는 객체를 생..
스프링부트로 백엔드 개발을 하다보니 자연스럽게 lombok 라이브러리를 많이 사용하게 되었다. @Getter, @Setter, @RequiredArgsConstructor...등 lombok 어노테이션으로 빈에 필요한 기능들을 간단하게 구현할 수 있다. 그래서 아래와 같이 dependency를 설정한다. - gradle compileOnly 'org.projectlombok:lombok:1.18.20' annotationProcessor 'org.projectlombok:lombok:1.18.20' testCompileOnly 'org.projectlombok:lombok:1.18.20' testAnnotationProcessor 'org.projectlombok:lombok:1.18.20' - mave..
지금까지 Mock이랑 MockMultipartFile을 이용해서 단위 테스트를 했었다. 그 떄까지는 순조로웠던 단위 테스트... 하지만 한 Service의 함수 한에 Util용으로 만들어둔 다른 클래스의 static 메소드를 호출하는 부분이 있었다. 바로 위와 같은 형식의 함수였다. 파일을 업로드하고 가져오고 삭제하고 디렉토리를 정리하는 등의 파일 관련된 공통 기능들이 들어 있는 FIleUtil이 Service 함수 중간 중간에 들어 있는데 특히 위와 같이 uploadFile()과 같이 파일을 업로드 하는 함수가 들어있는 TestService.method()와 같은 것을 테스트 하려고 하니까 FileUtil.uploadFile()이 작동해 계속 이상한 파일이 만들어지는 현상이 발생했다. 게다가 다른 함수..
지금까지는 JPA를 사용하면서 JPA에 Native Query를 사용하거나 jpa method를 조합해서 사용했었다. 아지만 n:m으로 매팽되는 데이터를 사용하게 되었고, 이를 Native Query를 이용해서 해결할 수 있으나 QueryDsl을 써서 해보자는 의견이 나와 QueryDsl을 쓰게 되었다. (아직은 QueryDsl이 뭔지 잘은 모르겠다. jpa의 함수들이 실제 돌아가는게 QueryDsl 기능들을 그 속에 넣어놔서 라고는 하지만...) 여하튼 QueryDsl을 쓰게 되었는데 다른 사람들은 IntelliJ, 나 혼자 Eclipse를 사용하게 되었다. 혼자 Eclipse를 쓰는 나, 다른 사람이 작성해놓은 QueryDsl 코드를 pull 받자마자 Q* 클래스들을 못 찾겠다는 에러를 내면서 실행도..
스프링부트에서 JPA를 사용하다가 모든 리스트를 다 지우고 처음으로 초기화 할 일이 생겼다. 그래서 나는 repository의 deleteAll() 함수를 사용한 후 for문을 통해 처음에 집어넣었던 값들을 똑같이 DB에 집어넣고자 saveAllAndFlush()를 했다. 그렇게 하면 기존에 이것저것 수정된 DB 데이터들이 모두 삭제되고 처음에 집어넣었던 값들을 다시 DB에 넣어서 DB는 이것저것 사용하기 전의 처음 값들을 가지게 될 것이라고 생각한 것이다. 하지만 primary key인 id 값이 이미 존재한다며 'javax.persistence.EntityExistsException' 에러가 발생했고 혹시 deleteAll()을 하고 나서 flush를 안 해서 그런가 하고 repository의 flu..
[ Enum ] JPA로 enum name 그대로 DB에 저장하기(@Enumerated) [ Enum ] JPA로 enum name 그대로 DB에 저장하기(@Enumerated) 최근에 Enum을 이렇게도 저렇게도 사용해보게 되었다. 그 동안 회사 프로젝트에서는 왜 사용을 안 했는지 정말 후회되는 Enum... 나 처럼 enum을 처음 사용해보는 사람은 JPA를 사용할 때 entity에 enum c pamyferret.tistory.com 위의 전 글에서 enum의 값을 DB에 name 그대로 저장하기 위해서 @Enumerated 어노테이션을 사용했었다. 하지만 이럴 경우 enum의 값이 변경 되었을 경우나 order 순서가 변경되었을 때 DB에 저장된 값과 enum의 값이 매칭되지 않아 문제가 발생할 ..
최근에 Enum을 이렇게도 저렇게도 사용해보게 되었다. 그 동안 회사 프로젝트에서는 왜 사용을 안 했는지 정말 후회되는 Enum... 나 처럼 enum을 처음 사용해보는 사람은 JPA를 사용할 때 entity에 enum class를 column으로 사용했을 때 DB에 원하던 enum 값(name)이 아니라 enum의 해당 값의 index가 들어가는 현상을 확인할 수도 있다. 예를 들어 아래와 같은 enum이 있다고 하자. @Getter public enum Menu { BULGOGI_PIZZA(10000, "PIZZA"), CHEESE_PIZZA(8000, "PIZZA"), POTATO_PIZZA(11000, "PIZZA"), ; } 또한 해당 Menu enum을 이용해서 아래와 같은 entity를 구성..
- Total
- Today
- Yesterday
- 스프링부트
- cache
- Java
- k8s
- 공간데이터
- DB
- 캐시
- HttpClient
- JPA
- DATABASE
- springboot
- MAC
- 데이터베이스
- Caching
- rabbitmq
- postgres
- enum
- 메시지큐
- Spring
- PostgreSQL
- annotation
- 어노테이션
- eclipse
- 캐싱
- mockito
- 이클립스
- ssh
- Intellij
- 역직렬화
- 자바
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |