[인프런 워밍업 스터디 클럽] 0기 - 두번째 발자국

[인프런 워밍업 스터디 클럽] 0기 - 두번째 발자국

두번째 발자국

이 글은 자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]를 수강하고 인프런 워밍업 클럽에 참여하여 쓰는 두번째 회고록입니다.

2주차 내용

2주차에서는 스프링 컨테이너에 대해서 배우고 JPA를 통해 API를 만드는 방법을 배웠다.

간단하게 요번주 수업 내용을 요약해보면 다음과 같다.

Day 7 스프링 컨테이너의 의미와 사용 방법(19강 ~ 22강)

여태까지의 개선들이 다 스프링 컨테이너와 빈을 설명하기 위한 것이란 걸 알았다.

먼저, 의존한다라는 것의 정의를 알 수 있었다. 그리고, 왜 인스턴스를 생성하지 않았는데 Controller의 생성자에서 JdbcTemplate를 사용할 수 있는 이유를 알게 되었다.

그 이유를 실제로 다른 곳(Repository)에 적용해나가면서 프로젝트를 또 개선해나가면서 스프링의 빈이 무엇인지 명확하게 알 수 있었다.

Day 8 Spring Data JPA를 사용한 데이터베이스 조작(23강 ~ 26강)

JPA를 왜 사용하는게 좋은지 그 이유에 대해서 알고 배워나가기 시작했다. 기본적인 Entity 정의하는 것과 일반적인 쿼리를 JPA에서는 어떻게 바뀌는 건지 알게 되었다.

이 단원에서는 두가지 부분에서 얻어 가는게 있었다.

  1. 최태현 선생님께서 JPA 로직 작성하실 때 setter를 안쓰고 updateName으로 메서드를 따로 만들었다. 최태현님의 유튜브 에서 setter를 사용하면 안되는 이유를 보게 되었다. 여태까지 와닿지가 않았었는데 안쓰는게 좋은 이유를 총망라해주셔서 너무 도움이 되었다. 특히 비지니스 로직과 테크니컬 로직에서의 setter 지양, 지향을 설명해주실 때 깨달음을 한 번 얻게 되었다.

     

  2. JPA를 사용하게 되면서 모던 자바 문법을 밥 먹듯이 사용하게 된다는 걸 알 수 있었다. 절대 그냥 넘어가면 안된다는 경각심을 다시 한번 깨우치게 됐다.

 

Day 9 트랜잭션과 영속성 컨텍스트(27강 ~ 29강)

트랜잭션에 대해서는 평소에 알고 있어서 무난했다.

그런데 영속성 컨텍스트는 처음들었다. 굉장히 신기했었다.

실습하면서 맨 처음에 다른 패키지의 @Transactional을 썼었었다. springframework에 있는 Transactional을 붙이자.

Day 10 조금 더 복잡한 기능을 API로 구성하기(30강 ~ 32강)

아예 처음부터 기능을 JPA를 사용해서 만들어보면서 체화하는 과정을 거쳤다. 인강을 먼저 보지 않고 내가 구현을 먼저 해봄으로써 마치 과제를 수행하듯이 하고 인강을 들으니 확실히 더 좋았다.

그리고 조금 복잡한 로직이 있으면 최태현님의 영상에서 처럼 잘게 쪼개고 주석으로 적고 기능 구현 한다는 점에 초점을 맞춰서 보았다.

과제

과제 6

여섯번째 과제: https://www.inflearn.com/blogs/6865

인강에서 처럼 Controller-Service-Repository 로 나누어 보는 과제였다.

과제 7

일곱번째 과제: https://www.inflearn.com/blogs/6901

공통 피드백을 듣고 단순히 문자열로 option 조건을 쓴 것을 enum class를 써서 바꿨다.

public List<FruitsSpecificOptionPriceRespond> getSpecificOptionPriceFruits(String option, Long price) {
        if (isNotSpecificPriceOption(option)) {
            throw new IllegalArgumentException();
        }
​
        List<Fruit> fruits = new ArrayList<>();
​
        if (GTE.equals(option)) {
            fruits =  fruitRepository.findByPriceGreaterThanEqualAndIsSold(price, false);
        }
​
        if (LTE.equals(option)) {
            fruits =  fruitRepository.findByPriceLessThanEqualAndIsSold(price, false);
        }
​
        return convertToFruitsSpecificOptionPriceRespond(fruits);
    }

하지만, 딱 봐도 한 눈에 코드들이 읽히지가 않는다. 계속해서 한눈에 읽혀지는 코드를 지향해야 되겠다.

댓글을 작성해보세요.