스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
인프런 김영한님 Spring 로드맵 1번 강의
서비스 로직을 작성하기 전 테스트 코드를 먼저 작성하는 것.
예를 들어 별모양 물건을 만들어야할 때, 모양이 잘 만들어졌을때 끼워넣어 확인을 할 수 있는 별모양 틀을 먼저 만드는 것.
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();
}
서비스 계층에서는 비즈니스에 의존적으로 설계. 용어도 비즈니스에 가깝게 지을 것.
리포지토리는 단순 명령수행을 담당하므로 용어도 간단하고 직관적으로 짓는 편.
테스트는 대부분 given(기반 데이터), when(검증대상), then(검증부) 으로 구성되므로 작성할때부터 3단계 구조대로 주석을 만들어주고 작성하는 것을 권장함.
스프링 빈으로 등록시킬때 사용하는 어노테이션.
@Service
, @Controller
, @Repository
등의 어노테이션에도 @Component
이 포함되어있어 등록이 가능하다.
단, 프로젝트 구조상 클래스의 위치를 구분하므로 아무데서나 어노테이션을 통해 빈을 등록할 수는 없다.
위 사진과 같은 구조일때 main메서드가 있는 클래스의 형제노드부터 어노테이션을 찾아가므로 main메서드가 있는 클래스보다 상위폴더에 있을 경우 spring이 찾을 수 없게된다.
스프링은 스프링 컨테이너에 스프링 빈을 등록할 때, 기본적으로 싱글톤으로 등록한다.
따라서 같은 스프링 빈이면 모두 같은 인스턴스가 된다.
특별한 경우 외에는 웬만하면 싱글톤 방식을 사용한다.
1) @Configuration
어노테이션을 통해 Config클래스를 생성한 후 거기서 @Bean
어노테이션으로 Service, Repository를 직접적으로 등록해줄 수 있다.
단, Controller의 경우 @Bean
을 통해 직접등록이 안되므로 @Controller
어노테이션을 이용해 등록해야 한다.
2) @Service
, @Repository
어노테이션을 통해 스프링 빈 등록을 해준다.
=> 이때 DI에는 필드 주입, setter 주입, 생성자 주입 으로 총 3가지 방법이 있으나 되도록 생성자 주입을 권장.
3) 과거에는 xml을 통해 직접 스프링 빈을 등록하기도 했으나, 현재는 거의 사용하지 않아 생략함.
윈도우의 경우 h2 DB설치 시 h2w.bat 파일을 실행시키면 됨.
최초 접속 시 연결
버튼을 선택해 접속. (연결테스트부터 선택하면 오류발생)
이후로는 접속 url을 localhost로, JDBC URL:을 jdbc:h2:tcp://localhost/~/test
로 변경하여 접속한다.
테스트는 반복해서 실행할 수 있어야 하므로 저장 등의 작업이 실제 DB에 저장되지 않아야 한다.
테스트 케이스에 @Transactional
어노테이션을 추가하면 테스트 완료 후에 항상 롤백을 실행해 테스트 결과가 DB에 반영되지 않는다.
보통 순수한 자바를 이용한 최소단위의 테스트를 단위 테스트, 컨테이너와 DB등을 반영한 테스트를 통합 테스트라고 함.
되도록 단위 테스트를 제대로 작성하여 테스트에 이용하는 것을 지향하도록 권장.
JPA는 인터페이스로, 구현체로 Hibernate를 사용함.
JPA는 객체와 ORM이라는 기술로, 객체의 관계를 맵핑한다는 의미.
맵핑에는 어노테이션을 사용.
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 = ?
처럼 메서드 이름에 따라 자동으로 쿼리생성.
그러므로 자동쿼리생성을 원하는 경우 메서드 명명 시 규칙을 지켜야 함.
AOP
: Aspect-Oriented Programming, 관점 지향 프로그래밍
어떤 기능을 개발할 때 핵심 관심사항
과 공통 관심사항
을 구분함.
AOP를 적용한 빈의 등록은 보통 AOP를 사용했다는 표시를 정확히 하기 위해 Config에 @Bean
어노테이션을 통해 직접 등록하는 경우가 많다.
단순히 @Component
어노테이션을 통해 등록해도 무관하나, AOP를 사용했음을 한눈에 알아보기 어렵다는 단점이 있다.
장점
도서 - 스프링 부트 핵심 가이드 (장정우 저)