공부공부 20

공부공부-230508

package-private https://hbase.tistory.com/4 패키지 접근 제어자는 private, default, protected, public이 있는데 그 중에서 default가 package-private이다. default는 같은 패키지 내에서만 호출가능하고 이외에는 private처럼 취급된다. 메소드나 클래스에 접근 제어자가 정의되어있지 않다면 default이다. 테스트 코드에서도 상용 코드와 동일한 디렉토리에 있다면 호출가능하다. src/main/java/game/baseball 디렉토리에 정의된 Ball 클래스의 메소드가 default 접근 제어자를 가진다면 src/test/java/game/baseball 디렉토리의 테스트 클래스에서 Ball 클래스의 메소드를 호출할 수 ..

공부공부 2023.05.08

공부공부-230506

Stream API sum https://bcp0109.tistory.com/299 Stream API를 이용해서 Collection의 합을 구하는 방법은 2가지가 있다. reduce, sum 둘 중 하나를 사용하는 것인데 reduce(초기값, 연산) 초기값을 시작으로 Collection을 돌며 입력한 연산을 진행한다. Stream.of(1, 2, 3).reduce(0, Integer::sum); sum() sum 메소드를 사용할 때는 IntStream, DoubleStream, LongStream과 같은 기본형(int, double, long) 특화 스트림을 사용해야 한다. 그래서 mapToInt, mapToDouble, mapToLong 메소드를 사용해서 기본형을 객체로 수정한 후 연산을 진행한다. ..

공부공부 2023.05.07

공부공부-230505

어린이날 클래스 분리 생성자 자바 클래스 안에는 다수의 생성자를 만들 수 있다. 주 생성자 하나에 다수의 부 생성자를 가지고 있는 것이 좋다. 이때, 부생성자는 반드시 주생성자를 호출하는 식으로 구성해야 중복이 없다. 또한, 주생성자는 생성자 중 가장 아래 구성하는 것이 관례이다. 메소드 클래스 안에는 5~10개의 생성자와 2~3개의 메소드를 만드는 것이 좋은데, 많은 메소드를 가진다는 것은 단일 책임 원칙을 위반하고 여러 가지의 역할을 하고 있을 가능성이 높다. 생성자와 메소드 적은 수의 메소드와 상대적으로 많은 생성자가 있는 클래스는 곧 응집도가 높고 견고한 클래스라는 뜻이다. private 메소드 테스트 테스트 메소드를 작성하다보면 private 메소드를 테스트해야하는 순간이 찾아온다. privat..

공부공부 2023.05.05

공부공부-230409

넥스트스텝 클린코드 TDD 진행 중 @ParameterizedTest를 사용해서 반복을 줄이면서도 여러 테스트를 진행하려고 했다. org.junit.jupiter.api.extension.ParameterResolutionException: No ParameterResolver registered for parameter [java.lang.String arg1] in method [void calculator.ParserTest.findCustomDelimiter(java.lang.String,java.lang.String,java.lang.String)]. 에러를 읽어보니 테스트코드의 인자가 하나 부족하다는 말 같았다. @ParameterizedTest @CsvSource(value = {"//;\n..

공부공부 2023.04.10

공부공부-230401

스프링 데이터 JPA는 JPA를 편리하게 쓸 수 있도록 도와주는 기술 스프링 데이터 JPA가 SpringDataJpa를 구현하는 레포지토리를 알아서 스프링 빈에 올린다. (스프링 데이터 JPA가 알아서 Hibernate 구현체를 생성해서 스프링 데이터 JPA 레포지토리에 주입하고 생성한다.) 이때 프록시라는 기술을 사용한다. 또한, 기본적으로 스프링 데이터 JPA가 제공하는 API만 사용할 수는 없기 때문에 메소드 명명 규칙이 있어서 해당 규칙대로 메소드를 만들 경우 스프링 데이터 JPA가 알아서 메소드를 만들어준다. 마치 아래와 같다. // JPQL select m from Member m where m.name = ? Optional findByName(String name) // JPQL selec..

공부공부 2023.04.01

공부공부-230320

@SpringBootTest 애노테이션을 사용하면 스프링 컨테이너와 함께 테스트를 실행한다. 스프링 통합 테스트 시 보통 운영 DB가 아닌 테스트 DB를 구축한다. @Transactional 데이터베이스에는 트랜잭션이라는 개념이 있어서 insert를 하면 바로 데이터가 들어가는 게 아닌 commit을 해야 데이터가 insert가 된다. 근데 보통은 auto commit이라 바로 데이터가 들어가기는 한다. (auto-commit mode인지 아닌지의 차이) 스프링 통합 테스트 시에 @Transactional 애노테이션을 사용하게 되면 1. 테스트를 실행할 때 먼저 트랜잭션을 실행하고 2. DB에 insert 쿼리를 실행한 다음 3. 테스트가 끝날 때 롤백을 해준다. DB에 어떠한 데이터도 반영되지 않기 때..

공부공부 2023.03.20

공부공부-230319

Optional java 8부터 들어간 기능인데 null이 반환될 경우 Optional로 형변환되어 반환되도록 한다. Optional.ofNullable('null이 될 수 있는 객체') JUnit으로 테스트 진행할 때 알아둬야하는 부분 테스트 실행 순서는 장담할 수가 없다. 따라서 실행 순서 의존적으로 테스트를 작성하면 안된다. 테스트를 할 때는 정상 플로우보다는 예외 플로우가 훨씬 중요하다. 동일한 객체를 여러번 선언 후 초기화해서 써야하는 경우 의존성 주입(생성자 주입 등..)으로 생성된 객체를 주입함으로써 빈번한 작업을 줄일 수 있다. 스프링을 실행하면 스프링 컨테이너라는 스프링 통이 생성된다. @Controller 애노테이션을 추가해놓으면 해당 컨트롤러 클래스 객체를 생성해서 스프링 통에 넣어놓..

공부공부 2023.03.19