External LIbrary 를 통해서 다양한 의존관계를 해결해줌. pnpm 같은 느낌으로 패키지 매니징 그 자체를 intellij가 해준다는 점
왼쪽 밑에 설정을 열어서 보는 것이 좋음
gradle을 통해서 보면, 다양한 내용이 나옴
Dependencies 를 보면, npm같이 안쪽으로 쭉 들어가는 깊은 Link가 있음
여기서 서버를 띄워주는 tomcat이 있음
과거에는 tomcat에 JAVA코드를 push하는 방식으로 진행됨
로깅
요즘은 logback을 통해서 하는 경우가 많음(slf4j interface)
테스팅
JUnit5 버전
mokito 모킹 라이브러리
assertj 편의성
spring-test 스프링 통합 테스트 지원
spring-io 에 가서, run 가서, documentation 을 가면, 간단한 공식문서가 되어있다.
보통 spring을 쓰는 방법
정적 컨텐츠, MVC+템플릿 엔진, API
바로 꺼내는 것이 get이 있지만, ,orElseGet 같은 것을 통해서 없는 경우 처리를 하는 경우가 많음
Optional을 반환시에, 안 이쁨
alt+엔터 자동 import
alt shift enter 다음 줄로 넘어가기
ctrl shift alt t 다양한 옵션 보기
ctrl t 자동 test제작
ctrl alt m 자동 extracting
ctrl p Extract 하기
ctrl alt v 자동 변수로 추출
alt+insert 생성자 자동 생성
given when then문법을 사용해서 Test를 작성하는 것이 좋음
컴포넌트 스캔과 자동 의존관계 설정
@Component, @Service, @Repository, @Controller같은 것들을 알아서 스캔해서 가져옴
@ComponentScan 이라는 것
main함수가 있는 하위 package는 등록을 시켜줌
싱글톤 방식 인스턴스 공유
JAVA 코드로 직접 등록하기
SpringConfig클래스 안에서 @Bean 태그를 이용해서 처리함. 타입 기준으로 생성시켜주는듯
과거에는 XML방식으로 처리했지만, 실무에서는 무조건 코드로 작성함
DI에서는 필드, setter, 생성자 주입
setter는 중간에 생성자가 노출된다는 점이 키워드다
생성자 쪽이 가장 권장됨
스프링 컨테이너에 올라가있는 부분만이 Autowired 가 작동함
우선순위 순서
controller index.html
순수 jdbc =>JDBC Template => JPA =>스프링 데이터 JPA
순으로 감싸는 것이 있음
spring frame work를 통해서 사용한다면
DataSourceUtils.getConnection(dataSource);를 통해서 connection을 가져와야 함.
아니라면 transaction같은 부분을 제대로 지킬 수가 없음
datasource부분은
@Autowired
public SpringConfig(DataSource dataSource){
this.dataSource=dataSource;
}
를 통해서 spring이 관리해줌
이때 db를 바꾸는 것도 정말 간단하게 Interface만으로 처리가 가능해버림
Transactional을 Integration Test 의 단계에서는 필요한데, 그 이유는 db에 데이터를 commit 해버리면 계속 데이터가 누적되어서 당연히 테스트가 깨질 가능성이 높다.
이때 Transaction을 걸면 알아서 rollback을 해줌
spring.jpa.show-sql=true //쿼리 보여주기
spring.jpa.hibernate.ddl-auto=none //테이블 자동 생성
도메이 안에 Member에다가 @Entity annotation을 추가하는 방식으로 진행함
Typeorm 베이스로 진행하는 것과 거의 동일해보인다
@Id @GeneratedValue(strategy=GenerationType.IDENTITY) 같은 것으로 처리 가능함
private final EntityManager em 을 통해서 모든 것을 자동함. Spring에서 em을 주입해줌. 이를 이용해서 쿼리를 알아서 만들어 줄 수 있다
jpql 이라고 하는 언어를 사용해야 함.
em.persist();
return member;
em.find(Member.class,id); 같은 방식으로 처리가 가능하구나...? 정도?
Optioinal.ofNullable(member)로 래핑해줘야 함
em.createQuery("select n from Member n",Member.class);
대상이 조금 특이함. *이 아니라, n을 적게 됨
List results = em.createQuery("select m from Member m where m.name = :name", Member.class)
.setParameter("name", name)
.getResultList();
return results.stream().findAny();
부분이 조금 특이했음
JPA의 경우 모든 변경이 @Transactional 안에서 실행되어야 함
JPQL 을 간단한 CRUD를 할 때는 interface만으로 처리가 가능함. method 이름을 이용한 쿼리
findByasdf => select m from Member m where m.asdf=:asdf",Member.class) 같은 쿼리를 만들어 낼 것
동적 쿼리 : 쿼리 dsl을 사용함
native 쿼리, jdbc템플릿 가능함.
@Around 라는 것을 통해서 AOP를 진행함
AOP적용시 프록시 패턴을 활용해서 Service를 관리함
Spring Container 를 통해서 관리했을 경우 모킹이 쉬움