목록Backend (18)
Arthur's Blog
🐛 문제 상황 static 변수에 @Value를 사용하였는데 null값이 들어가있음. 🏴☠️ 원인 Spring에서 static 변수에 값 주입을 허용하지 않기 때문이다. ♻ 해결법 해당 static field의 Setter를 만들어서 해당 메소드 위에 @Value(“${~~}”)를 붙인다.
🐛 문제 상황 @Value를 이용해서 값을 넣은 field를 이용해서 생성하는 Object가 있는데, getter를 사용해서 값을 확인해보니 null값이 들어가있음. 🏴☠️ 원인 @Value의 값이 들어가기 전에 Object가 생성되었기 때문 ♻ 해결법 @PostConstruct를 사용하면 된다. @PostConstruct는 의존성 주입이 이루어진 후 초기화를 수행하는 메소드이다.
📌 정의 Advice의 한 종류로 핵심 관심사의 실패여부와 상관없이 전 후로 실행되도록 하는 Advice이다. Advice는 실질적으로 어떤 일을 해야할지에 대한 것, 즉 실질적인 부가기능을 담은 구현체이다. 😉 사용법 Pointcut를 전달해주어야 한다. Pointcut는 횡단관심사(부가기능)이 적용될 joinPoint들을 정의한 것이다. 1️⃣ execution @Pointcut(“execution(접근제어자, 반환형 패키지포함 클래스 경로 메소드 파라미터)”) execution(* *(..))메소드의 파라미터가 개수 상관 X 접근제어자, 반환형 모두 상관 X, 어떠한 경로에 존재하는 클래스도 상관하지 않고 적용. execution(* test.spring..*(..)) 접근제어자, 반환형 모두 상관..
😁 공통점 Bean을 생성하는 어노테이션. 😵 차이점 @Bean 어노테이션의 docs를 가보면 ElementType.METHOD, ElementType.ANNOTATION_TYPE가 되어있고, @Component 어노테이션의 docs를 가보면 ElementType.TYPE으로 되어있다. 따라서 개발자가 직접 수정이 가능한 클래스에는 @Component를 사용하고, 라이브러리를 사용할 경우에는 해당 인스턴스를 생성하는 메소드 위에 @Bean을 사용한다. 간단하게 @Bean 어노테이션은 method 위에 붙일 수 있고, @Component 어노테이션은 class위에 붙일 수 있다.
@WithMockUser WithMockUser 어노테이션은 지정한 사용자 이름, 패스워드, 권한으로 UserDetails를 생성한 후 보안 컨텍스트를 로드한다. 값을 지정하지 않을 시에는 아래의 기본값을 갖는다. username : user roles : ROLE_USER password : password @WithAnonymousUser 익명의 사용자로 테스트하고 싶을 때 사용 @WithUserDetails 지정한 사용자 이름으로 계정을 조회한 후 UserDetails 객체를 조회하여 보안 컨텍스트를 로드하게 된다. value : 지정한 사용자 이름. Default user userDetailsServiceBeanName : UserDetails조회 서비스의 빈 이름. 하나만 있으면 기입하지 않아도..
# Example org.gradle.daemon=true org.gradle.caching=true org.gradle.parallel=true org.gradle.configureondemand=true Daemon Gradle의 Daemon(백그라운드에서 계속 돌고있음)을 설정하는 property이다. 빌드 시 Gradle을 띄우는 시간이 필요없어서 빌드 속도 향상 시 도움된다. Caching https://docs.gradle.org/current/userguide/build_cache.html 공식 문서상 다른 build에서 나온 결과물을 재사용하고, 변경되지 않은 것은 저장된 대로 사용한다고한다. 따라서 빌드 시 변경되지 않은 부분은 Storing(저장)된 파일을 사용해서 빌드 속도 향상 시 ..
class User { @Id private String username; @ManyToOne private School school; } @Query(select u from User u where user.school = :schoolName) List findBySchool(@Param('schoolName')String schoolName); 위 Repository interface는 얼핏 보면 그럴싸 해보이지만 실제로 구동을 시켜보면 500에러와 함께 application이 소리를 지른다. 그 이유는 school은 객체로 맵핑이 되어있기 때문인데 실제 작동을 시키려면 @Query(select u from User u where user.school.schoolName = :schoolName)..
@Getter @Setter public class QueryRequest { private userName; private userEmail; } @RestController @RequiredConstructor public class QueryController { private final UserService; @GetMapping("/") public QueryResponse QueryTest(QueryRequest query) { return userService.UseQueryMethod(query); } } 주의 사항으로는 QueryRequest에 존재하는 필드의 명과 QueryString으로 오는 필드의 명이 동일해야 한다는 점이다. 따라서 @JsonAlias("user_name")과 같이..