본문 바로가기
Spring

[Spring] 초간단 웹 어플리케이션 구현

by onejunu 2020. 7. 28.

**입문 글에서 너무 두서없이 일단 시작해보고 본거 같아서 본 글에서 확실하게 공부한 내용을 정리하고자 한다.

 

완성된 화면을 보고싶으시면 맨 아래로 가시면 됩니다

1. 요구사항 정리

 

공부도 할겸 매우 매우 심플한 예제를 들고 배운것을 응용해 보았다.

 

아래의 이미지는 고객의 비즈니스 요구사항이라고 가정했다. DB는 뭘쓸지 모르기때문에 인터페이스로도 구현한다.

 

테스트를 위한 데이터베이스로서 h2 데이터베이스를 사용하였다.

 

요구사항 정리

 

2. application.properties & build.gradle

 

application.properties

 

위는 데이터베이스와의 연결 정보를 담고 있는 설정파일이다. 나중에 datasource를 jpa 의 entity manager가 일을 할때 자동으로 설정하는 거 같다. 

 

url 은 로컬 ~ 디렉토리에 product.mv.db 파일을 데이터베이스로 쓴다. 패스워드가 없으므로 그냥 접근한다.

driver-class-name 은 데이터베이스 종류 이름이다.

show-sql 은 jpa가 일을 할때 날리는 sql문을 볼 수 있다. 아래 사진은 예시다.

jpa 가 날리는 sql 문

그리고 ddl-auto 는 시작될때 자동으로 ddl을 만들어 주는 기능인데 이는 미리 h2데이터베이스에서 상품객체를 만들고 시작할 것이기 때문에 none 으로 설정한다. 디폴트 값은 true다.

build.gradle

디펜던시는 위와 같이 설정했다. jdbc 가 아닌 jpa 로 설정했다.

 

 

3. 도메인 정의와 테이블만들기

 

간단하게 상품이름과 상품가격 그리고 데이터베이스에서 사용할 id 값만 있는 매우 단순한 구조다.

 

@Entity는 JPA에서 관리하는 객체라고 선언한다. 그러면 entity manager가 알아서 해준다.

 

클래스로 정의하고 상품테이블을 만들었다.

Product 도메인
ddl.sql

 

4. 레포지토리 인터페이스 작성하기

 

레포지토리의 기능도 단순하다.

 

1) 이름으로찾기

2)아이디로 찾기 

3)모두 찾기

4)가격으로 찾기

5)지우기

6)등록하기

 

레포지토리 인터페이스

 

5. jpa 레포지토리 클래스 작성하기

 

다음으로는 ProductsRepository 를 구현한 클래스를 작성해본다.

 

 

EntityManager가 알아서 다해준다. 이부분에 대해서는 이후에 깊게 파볼 예정이다. 

 

 

6. 레포지토리 기능 테스트해보기

 

레포지토리의 기능을 만들었으면 테스트를 해보자. 원래는 테스트 코드부터 만들어야 하지만 너무 간단하기 때문에 빠르게 한번 테스트 해본다.

 

테스트 하기전에  어노테이션 몇개만 설명한다.

 

@SpringBootTest : 실제 스프링 부트를 띄운 환경에서 테스트

@Transactional : 레포지토리 기능을 테스트 할때 거의 필수 적인데 모든 테스트 메소드를 독립적으로 만들어 준다. 내부적으로 메소드 실행후 자동으로 롤백해준다. 자세한 원리는 이후에 공부할 것이다.

@Autowired: 이는 스프링 부트를 띄운 환경에서 테스트할때 자동으로 빈으로 등록해준다. 필자는 테스트 환경에서만 선언하고 메인 환경에서는 SpringConfig 클래스를 따로 만들어 @Configuration을 통해 설정했다

@Test : 테스트를 시도할 메소드를 알려준다.

.

 

<테스트코드>

 

 

유용했던 코드는 Assertions(assertj,junit) 이다. 

 

 

레포지토리 테스트 통과

 

7.서비스 코드 작성하기

서비스를 하기위해서는 레포지토리에 반드시 의존해야한다. productsRepository 인터페이스를 선언한뒤 생성장를 통해 주입해주자.

만약에 new를 사용한다면 새로운 인스턴스를 만들기 때문에 어떤 저장소를 지칭하는지 애매할수있다. 이러한 상황은 절대 오면 안되기 때문에 단 하나의 레포지토리를 공유하기 위한 것이다. 이를 의존성 주입이라고 한다.

 

요구사항에서 했지만 다시 언급한다. 서비스의 기능은 다음과 같다.

 

1)상품 등록 (이름 중복 안됨)

2)상품조회 (가격 기준으로 정렬 유무를 선택할 수 있음)

3)이름으로 검색

4)가격으로 검색

5)이름으로 삭제하기

 

여기서 이름으로 검색한 결과는 반드시 1개만 나오지만 검색및 모든 조회결과를 productList.html 로 뿌려주기 위해  List<Product> 로 반환한다.

 

8.서비스 코드 테스트해보기

 

 

 

8.SpringConfig

지금까지  "서비스""레포지토리" 클래스를 완성하였고 테스트도 통과하였다.

 

이제 서비스와 레포지토리를 자바빈으로써 스프링컨테이너에 등록해야한다. 그래야 controller에서 요구하는 사항을  처리할 수 있기 때문이다.

 

빈으로 등록하는 방법으로 SpringConfig를 이용했다. 컴포넌트 스캔을 통해 @Service, @Repository, @Autowired 를 이용해 등록하는 방법도 있지만 SpringConfig가 더 편한거 같다.

 

 

 

데이터소스는 아까 properties에서 설정한 데이터베이스 연결 설정정보를 참조하여 스프링에서 알아서 처리한다.

build.gradle 디펜던시에서 jpa 관련 라이브러리를 땡겨온것을 기억하는가? 여기서 entity manager가 등장한다. 

@Configuration 과 entitymanager,datasource 가 관련있는 거 같다. 내부적인 자세한 원리는 이후 공부하겠다.

 

 

이로써 스프링 컨테이너에 자바빈을 등록하였다.

 

9.ProductController

 

필요한 기능들을 다 만들어 봤으니 Controller로 이제 웹화면을 만들어 볼것이다.

 

그전에 상품을 등록하려면 상품 등록 폼이 있어야 한다.

 

상품등록과 관련된 폼은 아래 코드로 작성한다.

 

 

얼마나 심플한가... 

 

만약에 @PostMapping 으로 어떠한 데이터들이 전달 되었다고 한다면 스프링에서는 자동으로 파라미터중 form 관련된 클래스를 찾는다.

 

그리고 해당하는 setXXX 어쩌고하는 이 XXX에 해당하는 데이터이름과 같은게 있다면 form 객체를 생성하고 form에 해당하는 메소드를 호출하여 데이터를 저장한다.

 

그러면 Controller 에서는 단순히 form에서 get 메소드를 통해 서비스에게 등록하라고 일만 시키면 되는 것이다. 자세한 것은 아래 코드로 살펴보자.

 

@Controller 를 통해 자바빈을 등록한다.

 

 

 

 

 

 

10. 완성된 화면 모음

 

템플릿은 html 관련된 것이므로 생략한다.

 

 

 

시뮬레이션

 

댓글