Spring/Introduction to Spring 22

AOP 적용

공통 관심 사항(cross-cutting concern) vs 핵심 관심 사항(core concern) 분리 1. 공통 로직 만들기 (시간 측정) @Aspect 애노테이션을 통해 AOP로 사용하겠다는 의미 @Around 애노테이션을 통해 타켓을 지정해 줄 수있는데 특정 클래스를 지정해줄 수 도 있다. 위에서는 hellospring패키지 안의 모든 클래스에 적용해주었다. joinPoint.proceed() : 다음 메소드 진행 joinPoint.toString()을 통하여 어떤 메소드를 call하는지 확인 2. AOP등록 스프링 빈으로 등록(@Bean) 컴포넌트 스캔(@Component) 스프링 빈에 등록해서 쓰는 것을 선호하는 경향임. 우리는 컴포넌트 스캔으로 진행 3. 실행 spring을 실행시키고 l..

AOP

AOP(Aspect Oriented Programming) - 관점 지향 프로그래밍 관점 지향은 쉽게 말해 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 관점을 기준으로 각각 모듈화하겠다는 것이다. 여기서 모듈화란 어떤 공통된 로직이나 기능을 하나의 단위로 묶는 것을 말한다. 예로들어 핵심적인 관점은 결국 우리가 적용하고자 하는 핵심 비즈니스 로직이 된다. 또한 부가적인 관점은 핵심 로직을 실행하기 위해서 행해지는 데이터베이스 연결, 로깅, 파일 입출력 등을 예로 들 수 있다. AOP에서 각 관점을 기준으로 로직을 모듈화한다는 것은 코드들을 부분적으로 나누어서 모듈화하겠다는 의미다. 이때, 소스 코드상에서 다른 부분에 계속 반복해서 쓰는 코드들을 발견할 수 있는 데 이것을 흩어..

Spring Data JPA

Spring Data JPA 스프링 부트와 JPA만 사용해도 개발 생산성이 정말 많이 증가하고, 개발해야할 코드도 확연히 줄어듭니다. 여기에 스프링 데이터 JPA를 사용하면, 기존의 한계를 넘어 마치 마법처럼, 리포지토리에 구현 클래스 없이 인터페이스 만으로 개발을 완료할 수 있습니다. 그리고 반복 개발해온 기본 CRUD 기능도 스프링 데이터 JPA가 모두 제공합니다. 스프링 부트와 JPA라는 기반 위에, 스프링 데이터 JPA라는 환상적인 프레임워크를 더하면 개발이 정말 재밌어진다. 지금까지 조금이라도 단순하고 반복이라 생각했던 개발 코드들이 확연하게 줄어듭니다. 따라서 개발자는 핵심 비즈니스 로직을 개발하는데, 집중할 수 있습니다. 실무에서 관계형 데이터베이스를 사용한다면 스프링 데이터 JPA는 이제 ..

jpa

JPA JPA는 기존의 반복 코드는 물론이고, 기본적인 SQL도 JPA가 직접 만들어서 실행해준다. JPA를 사용하면, SQL과 데이터 중심의 설계에서 객체 중심의 설계로 패러다임을 전환을 할 수 있다. JPA를 사용하면 개발 생산성을 크게 높일 수 있다. ORM기술로써, Object(객체) Relational(관계형 DB)를 Mapping한다는 의미이다. * JPA라이브러리 추가(build.gradle) jdbc까지 다 포함하고 있음. * 스프링 부트에 JPA 설정 추가(application.properties) show-sql : JPA가 생성하는 SQL문장 출력 ddl-auto : JPA는 테이블을 자동으로 생성하는 기능을 제공하는데, none를 사용하면 해당 기능을 끈다. 우리는 테이블을 이미 만..

JdbcTemplate

스프링 JdbcTemplate과 MyBatis 같은 라이브러리는 JDBC API에서 본 반복 코드를 대부분 제거해준다. 하지만 SQL은 직접 작생해야 한다. ==> 반복 코드 ==> resultset같이 매번 반복되는 코드들 참고로 생성자가 하나일 때는 @Autowired를 생략해 줄 수 있다. DataSource 설정 위에서 bean으로 등록한 DataSource를 주입 @Autowired에 의해 주입 JdbcTemplate 객체를 생성하여 dataSource를 주입한다. CRUD API 제공 SQL문 작성 RowMapper interface 구현을 통해 SQL의 결과를 객체에 매핑하여 결과를 리턴 mapRow()라는 interface Method를 정의하여 결과처리 한 번만 사용하는 기능의 경우는 R..

스프링 통합 테스트

@Transactional 테스트를 할 때 이 애노테이션을 달면 트랜잭션을 먼저 실행하고 테스트를 실행한 후에(DB insert 등등) 마지막에 Rollback을 해준다. 앞서 우리가 @BeforeEach를 통하여 테스트마다 리포지토리를 비워주었던 일을 하지 않아도 된다. 테스트마다 rollback해줌. 추가로 @Commit 애노테이션은 테스트 후에 commi시켜 실제 db에 등록한다. @SpringBootTest @SpringBootTest는 스프링 부트 어플리케이션 테스트 시 테스트에 필요한 거의 모든 의존성을 제공 어노테이션 @SpringBootApplication을 기준으로 스프링 빈을 등록함과 동시에 Maven 같은 빌드 툴에 의해 추가된 스프링부트 의존성도 제공 @SpringBootTest 어..

spring DB 접근

1. H2 데이터베이스 설치 개발이나 테스트 용도로 가볍고 편리한 DB, 웹 화면 제공 member 테이블 생성 2. 순수 jdbc 환경 설정 build.gradle 파일에 jdbc, h2 데이터베이스 관련 라이브러리 추가 스프링 부트 데이터베이스 연결 설정 추가 Jdbc 리포지토리 구현 주의! 이렇게 JDBC API로 직접 코딩하는 것은 20년 전 이야기이다. 따라서 고대 개발자들이 이렇게 고생하고 살았구나 생각하고, 정신건강을 위해 참고만 하고 넘어가자. (Eclipse에서 mysql을 연동하여 프로젝트할 때나, jsp를 할때 이 방식은 사용해봤으니 한번 훑고 넘어가는걸로 하자........ 다시봐도 머리아파..) package hello.hellospring.repository; import hel..

회원 웹 기능

1. 홈 화면 추가 컨트롤러가 정적 파일보다 우선순위가 높기 때문에 /로 들어오면 home.html이 실행. 2. 등록 @GetMapping ==> Get방식 (주소창에 직접 치는 것) @PostMapping ==> Post방식 (form을 통해 전달할 때 보통 summit으로 전달) 홈에서 회원가입을 누르면 get방식에 따라 @GetMapping되어 members/createMemberForm.html이 실행. 그 후, 이름을 입력하고 등록을 누르면 http post방식으로 전달되는데 이는 @PostMapping이 호출되어 새로운 Member객체가 생성되고 전달받은 name이 MemberForm클래스를 통해 form안에 담긴다. 이를 추출해 member의 이름으로 설정하고 이를 앞서 만든 회원가입 메소..

스프링 빈

스프링 빈과 의존관계 스프링 빈을 등록하고, 의존관계 설정하기 생성자에 @Autowired 가 있으면 스프링이 연관된 객체를 스프링 컨테이너에서 찾아서 넣어준다. 이렇게 객체 의존관계를 외부에서 넣어주는 것을 DI (Dependency Injection), 의존성 주입이라 한다. 이전 테스트에서는 개발자가 직접 주입했고, 여기서는 @Autowired에 의해 스프링이 주입해준다 스프링 컨테이너(Spring Container)에 의해서 자바 객체가 만들어 지게 되면 이 객체를 스프링은 스프링 빈이라고 부름. 등록방법에는 아래 두가지 방법이 있다. 컴포넌트 스캔과 자동 의존관계 설정 @ComponentScan 어노테이션은 어느 지점부터 컴포넌트를 찾으라고 알려주는 역할 @Component는 실제로 찾아서 빈에..

회원 서비스 테스트

Test given 주어지는 것 when 주어졌을 때 then 어떻게 되는지 1. 회원가입 테스트 (join) given member에 name은 hello when member를 join시킴 id값이 return되므로 saveId에 저장 then return되어 저장된 saveId를 가지고 repository에 저장되어 있는 member정보 가져옴. 그것을 우리가 생성한 member객체의 name과 비교 성공 테스트에서 가장 중요한 것은 반례, 즉 예외 case이다. 1-2. 회원가입 테스트 (join) - 중복 회원 가입 try - catch문을 통하여 오류를 받고 메세지 비교를 통해 테스트 검증 성공 * assertThrows메소드를 활용해 더 간단하게 테스트하기 memberService.join(..

반응형