본문 바로가기
반응형

개발128

[Spring Batch] Scope 'job' is not active for the current thread; consider defining a scoped proxy for this bean if you intend to refer to it from a singleton; Spring Batch에서 @JobScope사용시 아래와 같은 에러가 발생할 수 있다. Scope 'job' is not active for the current thread; consider defining a scoped proxy for this bean if you intend to refer to it from a singleton; 기존코드는 아래와 같았다. @JobScope를 빼면 문제없이 동작하는 코드가 @JobScope만 달면 빈 생성에서 에러가 발생했다. @Bean(name = "testJob") public Job testJob(JobCompletionNotificationListener jobCompletionNotificationListener){ return jobBuilderF.. 2020. 11. 16.
[Junit5] org.junit.platform.commons.JUnitException: @BeforeAll method must be static unless the test class is annotated with @TestInstance(Lifecycle.PER_CLASS). 요즘 TDD에 관심이 있어서 Junit5를 사용해보려고 한다. 테스트코드전에 실행되어야 하는 로직이 있어서 @BeforeAll을 사용하고자 했다. public class TddTest { @BeforeAll public void memberInit(){ System.out.println("Junit BeforeAll"); } @Test public void memberDomainTest() throws Exception{ System.out.println("TestCode 1"); } } 하지만 아래와 같은 오류가 발생했다. org.junit.platform.commons.JUnitException:@BeforeAll method must be static unless the test class is a.. 2020. 11. 9.
[Junit5] 아직도 @RunWith(SpringRunner.class)를 쓰는가? Junit5가 나온지 어느정도 시간이 흘렀다. 아직도 익숙하다는 이유만으로 Junit4를 사용하는가? "새로 시작하는 프로젝트 혹은 개인프로젝트에서는 Junit5를 사용해보자" 라고 마음 먹었다. 그런데 Test Code를 짜려는순간 @RunWith 가 없어져서 당황했다. 나와같은 개발자들이 있을거라 생각하고 글을적는다. 아래의 @ExtendWith(SpringExtension.class) 는 @RunWith(SpringRunner.class)와 동일하다 2020. 11. 1.
[JAVA] 함수의 결과를 성공과 실패만 판단하면 될때 반환값으로 어떤값이 좋을까? 함수의 결과를 성공과 실패만 판단하면 될때 어떤형식이 좋을까 ? 함수를 실행할때 반환값을 지정해줄 수 있다. void로 지정하면 반환값이 없어도된다. 함수를 실행만 하고 반환값이 필요없다면 void가 옳은선택일까? 그렇다면 함수를 실행하다가 실패한다면 예외를 던질것인가 ? 나쁘지 않은 선택이다. 하지만 void에는 2가지 단점이있다. 1. 테스트코드를 작성하기 힘들다. 2. 어떠한 이유때문에 예외가 발생됐는지 명확하게 알기 힘들다. 불리언으로 성공일때는 true 실패일 때는 false로 표현하는 간단한 방법도 있다. 어떤 동작이 성공/실패로 나뉘어지면 실패이유가 단1가지 뿐이라면 불리언도 좋은 선택이 될 수 있다. 하지만 대부분의 로직은 실패이유가 1개보다 많다. 이럴때 어떠한 이유때문에 예외가 발생됐는.. 2020. 9. 15.
[JAVA] Stream을 이용하여 Map 안에 있는 값 간편하게 출력하기 우리는 JAVA8 이전에 Map안에 있는값을 모두 출력하려면 조금 까다로웠다. JAVA8에 Stream이 추가되면서 간편하게 모든값을 출력할 수 있게되었다. public class main { public static void main(String[] args) { Map favouriteMovies = ofEntries( entry("1", "1") , entry("2", "2") , entry("3", "3") ); // 상황에 맞게 사용 favouriteMovies.forEach((k,v)-> System.out.println("key: "+k+" value: " +v)); favouriteMovies.entrySet().stream() .forEach(entry-> System.out.printl.. 2020. 8. 23.
[JAVA 8] Stream을 활용하여 합계를 구하는 여러가지 방법 예제에 사용할 Class는 2가지가 있다. Dish Class 와 main Class Dish.class package streamexam; public class Dish { private String name; private int calories; public Dish(String name, int calories) { this.name = name; this.calories = calories; } public String getName() { return name; } public int getCalories() { return calories; } } main.class import streamexam.Dish; import java.util.ArrayList; import java.util... 2020. 8. 21.
[Spring Boot] spring-data-redis 간단하게 적용해보기 개발환경 window spring boot 2.3.1 spring data redis 2.3.1 commons-pool2 2.8.0 (org.apache) lettuce-core 5.3.1 (io.lettuce) gradle Spring Boot환경에서는 Redis를 적용하기 매우 쉽습니다. 아래의 의존성이 필요합니다. 의존성을 추가한후 Gradle reimport를 해줍니다. 아래와같이 Config파일을 설정해줍니다. @Configuration @EnableRedisRepositories public class RedisConfig { private RedisConnectionFactory redisConnectionFactory; @Autowired public RedisConfig(RedisConn.. 2020. 7. 24.
[Spring Security] Custom Login 만들기 Spring Security를 적용하고 따로 설정을 하지 않으면 자체적으로 제공하는 Login Form을 사용한다. 하지만 대부분의 서비스는 서비스에 알맞는 Login Form을 사용하고 싶어한다. Custom Login Page를 어떻게 제작하는지 간단하게 살펴보겠다. 순서는 아래와 같이 크게 3가지로 나뉜다. SecurityConfig 등록 formLogin설정 변경 logout설정 등록 1. SecurityConfig등록 SecurityConfig를 등록해준다. http.formLogin().loginPage(사용할 페이지) 로 설정해준다. 이때 주의할점이 .permitAll()을 꼭 설정해줘야한다. 로그인을 해야하는데 권한이 없어서 들어가지 못하는 상황이 발생할 수 있다. 로그인페이지를 커스텀하게.. 2020. 7. 12.
[enum] enum의 활용방법 JAVA를 처음 배울때 enum 부분을 보면서 이걸 어디다 써? 쓸데도 없어보이는데 왜 배우는거지? 라는 의문이 들것이다. (나는 들었다...) 실제로 취업을 하고나서 팀장님께서 사용하시기 전까지만해도 쓸모가 없는줄 알았다. 하지만 enum은 상태값을 관리할때 매우 강력하다. 말로만 쓴다면 모르니 예제를 통해 알아보도록 하자. USER의 정보를 가지는 테이블이 있다. USER라는 테이블은 아래와 같이 USER의 권한을 가지는 컬럼이 있다. 우리는 "1"은 유저 "2"는 유저라고 정하고 그 규칙을 맞춰서 코딩을 했다. public class Account { private String Role; public Account(String role) { Role = role; } } public final cl.. 2020. 7. 11.
[effective java 3/E] 제네릭 <로 타입은 사용하지 말라> 제네릭을 사용할 때 로 타입(raw type)은 절대 사용하면 안된다. 왜 사용하면 안되는지 알아보기 전에 로 타입이 무엇인지 모르시는분들을 위해 용어 설명을 먼저 하겠다. 클래스와 인터페이스 선언에 타입 매개변수가 쓰이면 제네릭 클래스 or 제네릭 인터페이스라고 한다. 제네릭 클래스와 제네릭 인터페이스를 통틀어 제네릭 타입이라고 한다. 각각의 제네릭 타입은 매개변수화 타입을 정의한다. ex) List 제네릭 타입을 하나 정의하면 그에 딸린 로 타입(raw type)도 함께 정의된다. 예를든다면 List를 정의하면 List가 함께 정의되는데 List가 List의 로 타입이다. 로 타입이 무엇인지 알아보았으니 이제 왜 사용하면 안되는지를 알아 보겠다. 오류는 가능한 한 컴파일 시점에 발견해야 한다. "로 .. 2020. 7. 11.
[effective java 3/E] 추상 클래스보다는 인터페이스를 우선하라. 이번 글을 읽기 위해서는 추상클래스와 인터페이스의 차이점을 알아야한다. 자바8 버전이전에 가장 큰 차이점은 추상 클래스는 구현부가 있는 메소드를 가질 수 있지만 인터페이스는 가질 수 없다는점이 제일 컸다. 자바8 버전에서 디폴트 메소드가 추가되면서 인터페이스도 구현부를 가질 수 있게 되었다. 그렇다면 우리는 여기서 세가지 의문을 가질 수 있다. 인터페이스와 추상클래스는 똑같지 않나요? 인터페이스와 추상클래스 어떤것이 더 좋은건가요? 인터페이스와 추상클래스 어떻게 사용하나요? 인터페이스와 추상클래스는 똑같지 않나요? 여전히 다릅니다. 자바는 다중상속이 안되기에 추상클래스를 사용하면 다른 상속을 받지 못합니다. 인터페이스를 사용한다면 여러개를 구현할 수 있습니다. 인터페이스는 변수는 public static.. 2020. 7. 8.
[effective java 3/E] 상속보다는 컴포지션을 사용하라 상속은 코드를 재사용할 수 있는 강력한 수단이지만 잘못 사용하면 오류를 내기 쉬운 소프트웨어를 만들게 된다. 상속은 캡슐화를 깨뜨릴 수 있다. 상위 클래스가 어떻게 구현되느냐에 따라 하위 클래스의 동작에 이상이 생길 수 있다는 말이다. 예를 한번 들어보도록 하겠다. 시나리오는 아래와 같다. 1. 우리에게는 HashSet 을 사용하는 프로그램이 있다. 2. HashSet은 처음 생성된 이후 원소가 몇 개 더해졌는지 알 수 있어야한다. 방법은 매우 간단하다. 몇개가 추가되었는지 알 수 있는 변수 1개와 추가되는 개수를 변수에 더해주기만 하면된다. 우리는 상속을 이용한다면 아래와 같이 작성할 수 있을것이다. package item18; import java.util.Collection; import java... 2020. 7. 5.