일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- java 백준 1509
- java 1238
- ipfs bean
- spring mongoTemplate
- spring mongodb
- kotiln functional interface
- spring mongodb switch
- java 파티
- ipfs singletone
- 자바 백준 팩토리얼 개수
- 자바 1676
- 백준 특정한 최단 경로
- Java Call By Refernce
- 전략 패턴이란
- Spring ipfs
- mongodb lookup
- 백준 연결요소 자바
- nodejs rabbitmq
- java 팩토리얼 개수
- 백준 1504 java
- javav 1676
- java 1509
- spring mongoTemplate switch
- kotiln const
- kotiln const val
- rabbitmq 싱글톤
- 안정해시
- 백준 2252 줄세우기
- go
- 익명 객체 @transactional
- Today
- Total
목록web study/Spring (29)
공부 흔적남기기
다음과 같이 구성되어있다고 가정하자익명객체를 만들고 익명객체의 함수에는 @Transactional이 붙어있으며 해당 함수는 Transcation이 필요한 함수를 호출한다.@FunctionalInterfaceinterface TempHandleInterface { fun handle(something: String): String} import jakarta.annotation.PostConstructimport org.springframework.stereotype.Serviceimport org.springframework.transaction.annotation.Transactionalimport java.util.UUID@Serviceclass TempClass( private val t..
문제인식 Book { @Id val id : String val title: String val author: User } User { id: String name: String } 대충 다음과 같은 구조에서 mongodb에서 Aggregation한뒤 Book class로 Mapping해서 data를 가져오면 전부 잘 가져와지는데 id 만 null로 나온다. 참고로 spring data mongo는 기본적으로 id property strategy를 _id로 지정한다. 웃긴게 mongoTemplate할때는 id를 넣어도 잘되는데 @Query로 query는 무조건 _id를 넣어줘야한다 id 관련해서 버그가 참 많은 것 같다. 해결 방법 1 User의 id 에 @Field("id") 를 명시하기 해결 방법 2..
BeanPostProcessor란? 한국어로 그대로 번역하면 빈 후 처리기로 스프링 빈이 생성되기 전후(초기화 전후)에 IOC 컨테이너에 빈으로 등록되기전에 빈을 intercept해서 특정로직을 처리가능하게 해주는 스프링이 지원하는 객체이다. 주로 AOP를 사용하기위해 Proxy 객체를 생성해 IOC 컨테이너에 실제 빈 대신에 프록시를 넣을 떄 사용한다. 이 뿐만 아니라 다양하게 특정 빈이 초기화 되었을 때 어떤 로직을 실행한다던지 등 여러가지로 구현가능하다. BeanPostProcessor는 다른 빈 등록보다 선행된다. 예시 BeanPostProcess를 상속받아 구현 가능하다. class LogBeanPostProcessor( private val packageName : String, private..
프록시 팩토리란 Spring에서 지원하는 프록시 생성해주는 클래스로 프록시를 사용할 구현체(타겟)과 Advice, PointCut을 지정해서 프록시를 생성할 수 있다. 만약 타겟이 interface라면 jdk dynamic proxy를 생성하고 타겟이 구현체라면 cglib를 생성한다. 둘중에 하나만 사용하도록 설정도 가능하다. 최근 spring은 cglib를 기본값으로 사용하고 있다. Advice란 Advice란 프록시 로직을 의미한다 (로그, 캐싱, 권한 확인) Pointcut이란 Advice를 지정할 패키지,클래스,메소드 범위이다. 즉 Advice(로직) PointCut(범위)를 생성하고 ProxyFactory에 넘겨주면 알맞게 proxy를 생성해준다. 참고로 Advice와 PointCut을 합쳐 만..
문제 발생 프로젝트에서 12시마다 특정 주기를 가진 아이템을 새로 생성해주는 스케쥴러가 있다. 서버를 k8s에 pod가 4개인 replica로 배포했는데 12시마다 4개의 아이템이 중복 생성되는 것을 확인. 해결 방법 구색 Shced Lock을 통해 하나의 작업에 대해 여러 스케줄러가 동시에 접근하지 못하도록 Lock을 걸 수 있음 SchedLock이란 스프링 스케줄러가 태스크를 시작하기전에 (아마 AOP 를 통해서겠지) DB에 요청을 보내 Lock이 걸렸는지 확인한다. Lock이 걸렸다면 태스크를 Wait(기다리기)하지 않고 Drop(아에 실행 시키지 않음)한다. Lock이 걸리지 않았다면 task를 수행한다. SchedLock은 DB table 을 필요해 하는데 다음과 같다. @Document(Sch..
How to use switch case on spring mongo data mongotemplate 프로젝트에서 mongodb를 사용하는데 project시 분기를 태워서 나타내야하는 field가 존재했다. 예를들어 student { id: ObjectId, name: String, stauts: int, } 이라는 객체가 있다고 가정하자 status가 0일때 ABSENT, 1 일때 ATTENDANCE, -1 일떄 FIRE 로 표현해야한다. 물론 data를 그냥 받아서 for문을 돌려서 바꿔줄 수 있지만 project를 통해 충분히 구현이 가능하고 성능으로 봐도 더 좋을 것이라 생각했다. mogodb stage에서는 아주 간단했다. 이곳을 참조하면 쉽게 구현할 수 있다. https://www.mongo..
스프링 & 코틀린 프로젝트에서 gradle build가 자꾸 'compilejava' task (current target is 11) and 'compilekotlin' task (current target is 1.8) jvm target compatibility should be set to the same java version. error가 뜨면서 stuck이 되는 문제가 있었다. tasks.withType { kotlinOptions { freeCompilerArgs = listOf("-Xjsr305=strict") jvmTarget = "11" } } 이 적혀있음에도 계속 오류가났다. 그래서 java 버전이 잘못되었나 확인도 해보았고, gradle에 이것저것도 추가해보고 컴퓨터도 껏다켜보고 ..
파일, 이미지, 폴더 등 저장소로 IPFS 를 사용하고 있는데 스프링 빈으로 등록하여 사용시 자꾸 IPFS 데몬이 꺼지는 문제점이 발생 코드는 다음과 같다. @Configuration class IpfsConfig( private val appProperties: AppProperties, ) { @Bean fun ipfs(): IPFS{ return IPFS(appProperties.ipfsHost, 5001) } } 왜 그런지 고민을 좀 해보다가 @Bean의 destroy method가 shutdown이나 close를 추론해서 자동으로 빈이 사라지기 전에 호출한다는 것이 기억이 났다. 찾아보니 IPFS Class에 shutdownMethod가 있었고 이것을 자동으로 호출해서 발생하는 문제였다 . 다음..
개발 도중 @JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class) 을 사용하여 isDeleted를 is_deleted로 보냈는데 날라가는 메세지를 보니 deleted로 날라갔다. 찾아보니 직렬화 하는 도중에 is가 제거된다.. @get:JsonProperty("is_deleted") @param:JsonProperty("is_deleted") var isDeleted: Boolean? = false, 를 사용하면 is를 사용할 수 있다. 참고로 요즘 개발할 때에는 형용사 앞에 is 붙이는 걸 선호하지 않는다. 어차피 값은 true 혹은 false일 것이기 떄문.
JPA란? JPA는 ORM 기술 표준으로 객체를 관계형 데이터베이스 매핑해주는 기술입니다. JPA를 사용하는 이유 생산성 지루하게 짜던 반복전인 SQL을 JPA를 통해 대신 처리할 수 있습니다. SQL 중심적인 개발을 객체 중심으로 개발할 수 있습니다. 유지보수 SQL을 직접 다루면 엔티티에 필드를 하나만 추가해도 등록,수정,조회 SQL과 결과를 매핑하기 위한 JDBC API코드를 작성해야하는데 JPA가 대신 처리해주므로 유지보수해야 하는 코드수가 줄어듭니다. JPA 성능 최적화 기능 1차 캐시와 동일상 보장 (캐싱 가능) 트랜잭셕을 지원하는 쓰기지연(버퍼링 기능) 지연로딩 즉시로딩 패러다임 불일치 해결 JPA는 상속, 연관관계, 객체 그래프 탐색, 비교하기와 같은 패러다임의 불일치 문제를 해결해줍니다...