eclipes4j's 개발은 언제나 즐겁다.

Spring Data JPA에서 @Query사용시 Parameter

Programming!

기존 고x몰이라는 PHP 쇼핑몰을 Java/JPA로 전환하는중 DB 테이블에 1:1 매핑된 Entity로는 뭔가 CUD 관련 처리 하는게 불안해서, 

(실제 type이 망.. 단순 true/false가 고x몰에 한테이블에 어떤 컬럼은 y / n 어떤 컬럼은 o / null 어떤 컬럼은 1 / 0 어떤 컬럼은 Y / N.....으..)

가능하면 update시에 필요 entity를 별도 생성하거나 항목별 update를 하도록 하고 있다.

 

항목별 업데이트를 할 경우 여러개의 param을 사용하기도 하는데 그냥 Object를 넘겨서 처리하는 것이 좀 더 깔끔해 보인다.

(라고 나는 주장한다~~~~으~~~)

 

기존 : 

@Query("update User set name = :name, age = :age, ssn = :ssn where id = :id")
int updateSpecificAttribute(@Param("name") String name, @Param("age") Integer age, @Param("ssn") String ssn, @Param("id") Long id );

 

요로코롬 : 

@Query("update User set name = :#{#paramUser.name}, age = :#{#paramUser.age}, ssn = :#{#paramUser.ssn} where id = :#{#paramUser.id}")
int updateSpecificAttribute(@Param("paramUser") User user );

 

 

Stream 내 값에 대한 Distinct 처리

Programming!

기본적인 중복 제거는 아래와 같이 distinct() 를 사용하는 것이다. 편하네..

List<String> distinctNames = Arrays.asList("닉", "그리썸", "이블린", "그리썸", "호라시오", "맥", "이블린").stream().distinct().collect(Collectors.toList());
log.debug("DistinctNames = {}", distinctNames);

 

특정 오브젝트에 속성 값을 distinct() 할 경우는 아래와 같이 별도의 function을 만들어 처리한다.

User.java

@Getter
@Setter
@Builder
@ToString
class User {
	private String name;
	@Default
	private int age = 0;
}

StreamDistinct.java (별도로만..)

public static <T> Predicate<T> distinctByKey(Function<? super T, ?> attributeKey) {
	Set<Object> seen = ConcurrentHashMap.newKeySet();
	return t -> seen.add(attributeKey.apply(t));
}

 

Test

@Test
public void test_Distinct2(){
	List<User> users = Lists.newArrayList(User.builder().name("닉").build(), User.builder().name("그리썸").build(), User.builder().name("닉").build());
	List<User> distinctUsers = users.stream().filter(distinctByKey(User::getName)).collect(Collectors.toList());
	log.debug("DistinctNames = {}", distinctUsers);
}

 

Spring Security 에서 @Async 사용시 (threads) Context 공유하기

Programming!

기본적으로는 @Async 사용시 SecurityContext가 공유되지 않는다. 즉, JPA의 Audit를 사용한 CRUD 실행시  @Async 를 적용하면 Null 오류가 출력된다.

 

 

SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL);

처리는 간단하게 SecurityConfiguration에 전파에 대한 지정만 해주면 된다.

 

 


Async 처리

https://www.baeldung.com/spring-async

 

How To Do @Async in Spring | Baeldung

How to enable and use @Async in Spring - from the very simple config and basic usage to the more complex executors and exception handling strategies.

www.baeldung.com

Feature

Completablefuture

ThreadPoolTaskExecutor