AOP 적용 - AOP : Aspect Oriented Programming - 공통 관심 사항(cross-cutting concern) vs 핵심 관심 사항(core concern) 분리 한곳에 모으고, 내가 원하는 곳에 공통 관심 사항을 적용한다는 개념이 AOP이다. Aop는 @Aspect 라는 애너테이션을 적어줘야 한다. 그리고 작성한 Aop 클래스인 TimeTraceAop를 스프링빈으로 등록해줘야 한다. 기본적으로 @Component 애너테이션을 작성해줘도 되고, 스프링빈에 직접 등록해줘야 한다! 따라서 AOP 같은 경우 스프링 빈에 직접 등록하는 방식을 선호한다. 그리고 추가적으로 @Around 애너테이션을 TimeTraceAop 클래스 내부에 적어줘야 한다! @Around("execution(..
AOP가 필요한 상황 - 모든 메소드의 호출 시간을 측정하고 싶다면? - 공통 관심 사항 (cross-cutting concern) vs 핵심 관심 사항 (core concern) - 회원 가입 시간, 회원 조회 시간을 측정하고싶다면? join() 메서드의 실행시간을 측정해보자. System.currentTimeMills(); 이것을 사용하면 밀리세컨드로 받을 수 있다. 문제 - 회원가입, 회원 조회에 시간을 측정하는 기능은 핵심 관심 사항이 아니다. - 시간을 측정하는 로직은 공통 관심 사항이다. - 시간을 측정하는 로직과 핵심 비즈니스의 로직이 섞여서 유지보수가 어렵다. - 시간을 측정하는 로직을 별도의 공통 로직으로 만들기 매우 어렵다. - 시간을 측정하는 로직을 변경할 때 모든 로직을 찾아가면서 ..
스프링 데이터 JPA 스프링 부트와 JPA만 사용해도 개발 생산성이 정말 많이 증가하고, 개발해야할 코드도 확연히 줄어듭니다. 여기에 스프링 데이터 JPA를 사용하면, 기존의 한계를 넘어 마치 마법처럼, 리포지토리에 구현 클래스 없이 인터페이스 만으로 개발을 완료할 수 있습니다. 그리고 반복 개발해온 기본 CRUD 기능도 스프링 데이터 JPA가 모두 제공합니다. 스프링 부트와 JPA라는 기반 위에, 스프링 데이터 JPA라는 환상적인 프레임워크를 더하면 개발이 정말 즐거워집니다. 지금까지 조금이라도 단순하고 반복이라 생각했던 개발 코드들이 확연하게 줄어듭니다. 따라서 개발자는 핵심 비즈니스 로직을 개발하는데, 집중할 수 있습니다. 실무에서 관계형 데이터베이스를 사용한다면 스프링 데이터 JPA는 이제 선택이..
JPA - JPA는 기존의 반복 코드는 물론이고, 기본적인 SQL도 JPA가 직접 만들어서 실행해준다. - JPA를 사용하면, SQL과 데이터 중심의 설계에서 객체 중심의 설계로 패러다임을 전환할 수 있다. - JPA를 사용하면 개발 생산성을 크게 높일 수 있다. JPA는 중간에서 DB에 SQL을 날리고, DB를 통해서 데이터를 가져오는 것을 처리! build.gradle 수정 application.properties 수정! spring.datasource.url=jdbc:h2:tcp://localhost/~/test spring.datasource.driver-class-name=org.h2.Driver spring.datasource.username=sa spring.jpa.show-sql = tru..
순수 Jdbc와 동일한 환경설정을 하면 된다. 스프링 JdbcTemplate과 MyBatis 같은 라이브러리는 JDBC API에서 본 반복 코드를 대부분 제거해준다. 하지만 SQL은 직접 작성해야 한다. 생성자 1개이면 @Autowired 생략 가능! JdbcTemplateMemberRepository 생성! 조회부분 package hello.hellospring.repository; import hello.hellospring.domain.Member; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework...
MemberServiceIntegrationTest 생성(MemberServiceTest 복사 붙여넣기) 기존에 MemberServiceTest는 순수하게 자바 코드로만 이루어져있기 때문에 JVM안에서 끝나는 테스트이기 때문에 시간소요가 거의 없다. MemberServiceIntegrationTest package hello.hellospring.service; import hello.hellospring.domain.Member; import hello.hellospring.repository.MemberRepository; import hello.hellospring.repository.MemoryMemberRepository; import org.junit.jupiter.api.AfterEach; ..
의존관계주입(DI)란? DI는 의존관계를 외부에서 결정(주입)해주는 것을 말한다. 스프링에서는 이러한 DI를 담당하는 DI 컨테이너가 존재한다. A라는 가게는 B라는 배달업체를 통해 배달을 진행한다. Class Store { private Deliver B; public Store() { this.B = new Deliver(); } } 이 같은 경우는 Store 클래스 내부에서 직접 B라는 Deliver 업체를 생성하기 때문에 의존성 주입이 이루어지지 않았다. 따라서 B라는 업체에서 C라는 업체를 바꾸기 위해서는 Store 내부 코드도 변경해야 한다. => 결합도가 높다. Class Store { private Deliver B; public Store(Deliver B) { this.B = B; } ..
먼저 build.gradle 파일에 jdbc, h2 데이터베이스 관련 라이브러리 추가 주의!: 스프링부트 2.4부터는 spring.datasource.username=sa 를 꼭 추가해주어야 한다. 그렇지 않으면 Wrong user name or password 오류가 발생한다. 참고로 다음과 같이 마지막에 공백이 들어가면 같은 오류가 발생한다. spring.datasource.username=sa 공백 주의, 공백은 모두 제거해야 한다. package hello.hellospring.repository; import hello.hellospring.domain.Member; import org.springframework.jdbc.datasource.DataSourceUtils; import javax..
Windows Installer 선택 후 다운! 시작프로그램에서 H2 Console 실행 위 JDBC URL로 접근 시 웹콘솔과 애플리케이션이 동시접근이 안될 수 있다. 따라서 그 다음 접근 시에는 jdbc:h2:tcp://localhost/~/test 로 접근해서 사용해야 여러군데에서 접근 가능하다. drop table if exists member CASCADE; create table member ( id bigint generated by default as identity, //generated by default as identity : 데이터 입력 시 ID값 null이면 자동으로 채워준다. name varchar(255), primary key (id) ); insert into member..
회원 목록을 눌렀을 때 /members url 매핑된 곳으로 넘어가게 셋팅해두었으므로 MemberController에 @GetMapping("/members") 로 두고 회원가입한 리스트를 보여주기 위해 Member 객체에 저장된 데이터를 List 형태로 받아온다! 그리고 model.addAttribute를 해서 members에 해당 List를 담아 view 템플릿에 넘길 것이다! 넘길 곳은 "members/memberlist" 이다! memberList.html을 만들고 List 형태로 모든 회원의 정보를 넣어둔 members 를 가져오게 셋팅한다! 이때 th:each문은 타임리프(Thymeleaf) 반복 기능 문법이다! 반복 기능 th:each = "변수 : 컬렉션" 방식으로 사용! 해당 컬렉션이 끝..