[Spring] 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 강의정리

하파타카·2023년 11월 20일
0

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
인프런 김영한님 Spring 로드맵 1번 강의


스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

섹션3 회원관리 예제 - 백엔드 개발

TDD란?

서비스 로직을 작성하기 전 테스트 코드를 먼저 작성하는 것.
예를 들어 별모양 물건을 만들어야할 때, 모양이 잘 만들어졌을때 끼워넣어 확인을 할 수 있는 별모양 틀을 먼저 만드는 것.

Optional 사용 시 권장사항

Optional을 사용하여 리턴값을 받아올 때 직접 변수를 선언해 가져오는 것보다 바로 사용하는 방향을 권장함.

// 수정 전
public Long join(Member member){
    // 같은 이름의 중복회원 불가
    Optional<Member> result = memberRepository.findByName(member.getName());
    result.ifPresent(m -> {
        throw new IllegalStateException("이미 존재하는 회원입니다.");
    });

    memberRepository.save(member);
    return member.getId();
}

// 수정 후
public Long join(Member member){
    // 같은 이름의 중복회원 불가
    memberRepository.findByName(member.getName()).ifPresent(m -> {
        throw new IllegalStateException("이미 존재하는 회원입니다.");
    });

    memberRepository.save(member);
    return member.getId();
}

service, repository 네이밍

서비스 계층에서는 비즈니스에 의존적으로 설계. 용어도 비즈니스에 가깝게 지을 것.
리포지토리는 단순 명령수행을 담당하므로 용어도 간단하고 직관적으로 짓는 편.

Test 시 권장하는 구조

테스트는 대부분 given(기반 데이터), when(검증대상), then(검증부) 으로 구성되므로 작성할때부터 3단계 구조대로 주석을 만들어주고 작성하는 것을 권장함.

@Component 어노테이션

스프링 빈으로 등록시킬때 사용하는 어노테이션.
@Service, @Controller, @Repository 등의 어노테이션에도 @Component이 포함되어있어 등록이 가능하다.
단, 프로젝트 구조상 클래스의 위치를 구분하므로 아무데서나 어노테이션을 통해 빈을 등록할 수는 없다.


위 사진과 같은 구조일때 main메서드가 있는 클래스의 형제노드부터 어노테이션을 찾아가므로 main메서드가 있는 클래스보다 상위폴더에 있을 경우 spring이 찾을 수 없게된다.

스프링 빈과 싱글톤

스프링은 스프링 컨테이너에 스프링 빈을 등록할 때, 기본적으로 싱글톤으로 등록한다.
따라서 같은 스프링 빈이면 모두 같은 인스턴스가 된다.
특별한 경우 외에는 웬만하면 싱글톤 방식을 사용한다.

스프링 빈 등록

1) @Configuration어노테이션을 통해 Config클래스를 생성한 후 거기서 @Bean어노테이션으로 Service, Repository를 직접적으로 등록해줄 수 있다.
단, Controller의 경우 @Bean을 통해 직접등록이 안되므로 @Controller어노테이션을 이용해 등록해야 한다.
2) @Service, @Repository어노테이션을 통해 스프링 빈 등록을 해준다.
=> 이때 DI에는 필드 주입, setter 주입, 생성자 주입 으로 총 3가지 방법이 있으나 되도록 생성자 주입을 권장.
3) 과거에는 xml을 통해 직접 스프링 빈을 등록하기도 했으나, 현재는 거의 사용하지 않아 생략함.

섹션5 스프링 DB 접근 기술

h2 DB 설치

윈도우의 경우 h2 DB설치 시 h2w.bat 파일을 실행시키면 됨.
최초 접속 시 연결 버튼을 선택해 접속. (연결테스트부터 선택하면 오류발생)
이후로는 접속 url을 localhost로, JDBC URL:을 jdbc:h2:tcp://localhost/~/test로 변경하여 접속한다.

DB 통합 테스트

테스트는 반복해서 실행할 수 있어야 하므로 저장 등의 작업이 실제 DB에 저장되지 않아야 한다.
테스트 케이스에 @Transactional어노테이션을 추가하면 테스트 완료 후에 항상 롤백을 실행해 테스트 결과가 DB에 반영되지 않는다.

보통 순수한 자바를 이용한 최소단위의 테스트를 단위 테스트, 컨테이너와 DB등을 반영한 테스트를 통합 테스트라고 함.
되도록 단위 테스트를 제대로 작성하여 테스트에 이용하는 것을 지향하도록 권장.

JPA

JPA는 인터페이스로, 구현체로 Hibernate를 사용함.
JPA는 객체와 ORM이라는 기술로, 객체의 관계를 맵핑한다는 의미.
맵핑에는 어노테이션을 사용.

JPA는 모든 데이터 변경이 트랜잭션 안에서 실행되어야 함.

Spring data JPA

  • Spring data JPA는 JPA를 편리하게 사용하도록 도와주는 기술.
    따라서 JPA에 대한 학습이 선행되어야 함.
  • Spring data JPA를 사용하면 리포지토리에 구현 클래스 없이 인터페이스 만으로 개발이 가능.(단, 100% 커버는 어려움)
    기본 CRUD 기능도 Spring data JPA에서 제공.
  • 단순반복코드를 크게 줄일 수 있어 개발자는 핵심 비즈니스 로직 개발에 집중할 수 있음.
  • 메서드 이름에 따라 자동으로 쿼리생성.
  • 페이징 기능 자동 제공.
  • 복잡한 동적 쿼리는 Querydsl을 이용하기도 함.

🚨알아두기
JPA =! Spring data JPA

public interface SpringDataJpaMemberRepository extends JpaRepository<Member, Long>, MemberRepository {

    @Override
    Optional<Member> findById(Long aLong);
}

이때 인터페이스의 메서드 명명에 따라 JPQL이 자동으로 쿼리를 생성해줌.
findByName(String name);일 경우 SELECT m FROM Member m WHERE m.name =?,
findByNameAndId(String name, Long id);일 경우 SELECT m FROM Member m WHERE m.name =? AND m.id = ? 처럼 메서드 이름에 따라 자동으로 쿼리생성.
그러므로 자동쿼리생성을 원하는 경우 메서드 명명 시 규칙을 지켜야 함.

섹션6 AOP

AOP

AOP : Aspect-Oriented Programming, 관점 지향 프로그래밍
어떤 기능을 개발할 때 핵심 관심사항공통 관심사항을 구분함.

  • 핵심 관심사항 : 비즈니스 로직을 개발할 때 해당 비즈니스 로직이 처리하려는 목적 기능을 말함
  • 공통 관심사항 : 핵심 관심사항이 아닌 부가적으로 반복되는 로직.
    예) 로깅, 트랜잭션, 로직 처리시간 측정 등

AOP를 적용한 빈의 등록은 보통 AOP를 사용했다는 표시를 정확히 하기 위해 Config에 @Bean어노테이션을 통해 직접 등록하는 경우가 많다.
단순히 @Component어노테이션을 통해 등록해도 무관하나, AOP를 사용했음을 한눈에 알아보기 어렵다는 단점이 있다.

장점

  • 반복되는 코드를 공통 관심사항으로 모아 따로 관리할 수 있음
  • 공통 관심사항 수정 시 핵심 관심사항에 영향을 끼치지 않음
    => 핵심 관심사항을 관리하기 쉬워짐
  • 인터셉터를 이용해 원하는 구간에서 공통 관심사항을 적용할 수 있음. 보통은 패키지를 기준으로 적용시킴.

🔗참고자료

도서 - 스프링 부트 핵심 가이드 (장정우 저)

profile
천 리 길도 가나다라부터

0개의 댓글