프로젝트 생성
이번 활용편 강의는 JPA를 활용해 직접 WEB을 구현해보는 실습 수업이다. 강의 에서는 SpringBoot를 SpringBoot initialize에서 만들었지만 인텔리제이에서 SpringBoot를 한번에 만들어주므로 나는 인텔리제이에서 한번에 만들었다.
추가한 dependecies는
- Spring Boot Web
- H2Database
- Spiring Boot JPA
- thymeleaf
- Lombok
이렇게 5개를 추가해주었다. Lombok은 저번에 SpringBoot를 공부할 때 사용을 해봤다. 손쉽게 코드를 짤 수 있게 도와주는 것이다. 대표적인 것은 Getter와 Setter가 있다.
라이브러리 살펴보기
현재 만든 프로젝트에 dependencies부분이다.
- 'org.springframework.boot:spring-boot-starter-web'
이렇게 tomcat과 webmvc가 존재해 쉽게 Web application을 세팅 할 수 있다.
- 'org.springframework.boot:spring-boot-starter-data-jpa'
Spring Boot에서 JPA를 사용 할 수 있게 만드는 것이다. 여기에는 aop와 JDBC등이 들어있고 제일 중요한 것은 HikariCP라는 Connection Tool이 존재한다. 그리고 hibernate가 존재한다.
Spring Boot Starter를 사용하면 logging이 존재한다. logging에는 logback을 기본으로 쓰고 있다.
Spring Core도 여기 존재한다.
- 'org.springframework.boot:spring-boot-starter-test'
Spring Boot에서 test를 하기위해 사용하는 것이다. 여기는 junit과 mockito, assertj등이 들어가 있다.
정리하자면 핵심 라이브러리에는 스프링MVC, 스프링ORM, JPA, 하이버네이트, 스프링 데이터 JPA가 존재한다.
기타 라이브러리에는 H2 데이터베이스 클라이언트, 커넥션 풀: 부트 기본은 HikariCP, WEB(thymeleaf), 로깅 SLF4J & LogBack, 테스트가 존재한다.
View 환경 설정
jpabook.jpashop.HelloController를 하나 만든다. 그 후 거기에
package jpabook.jpashop;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HelloController {
@GetMapping("hello")
public String hello(Model model){
model.addAttribute("data","hello!!!");
return "hello"; //화면 이름
}
}
이렇게 만들어준다. Model은 Model에 데이터를 넣어서 View에 넘겨 줄 수 때 사용한다.
resources.templates에 hello.html파일을 만들어 주면 된다. 그러면 return 값인 hello를 통해 hello.html을 띄워준다. 여기서 thymeleaf에 장점이 나온다. thymeleaf는 hello.html을 크롬으로 그냥 열시 코드가 아닌 결과값을 제대로 보여준다.
- resources:templates
실행을 시켜주면 결과가 잘 나온 모습을 볼 수 있다. return에 hello만 해주었는데 template hello.html을 띄워줄수 있는 이유는 Spring Boot가 지원해주는 것이다.
스프링 부트 thymeleaf viewName 매핑을
resources:templates/ +{ViewName}+ .html 형식으로 해준다!!
- resources:static
정적 컨텐츠는 static 패키지에 html 페이지를 추가해주면 된다.
html 파일을 변경할 때 마다 서버를 재시작해야하는 단점이 있다. 하지만 아래의 코드를 build.gradle에 추가해주면 이 문제를 해결할 수 있다. 추가해주고 html 파일에서 Recompile만 누르면 서버 재시작 없이 크롬창에 내용이 변경된다.
implementation 'org.springframework.boot:spring-boot-devtools'
JPA와 DB 설정, 동작확인
H2Database는 저번 기본편 강의에서 사용을 해봤기 때문에 설정하는데에는 어려움이 없었다.
이번 강의에서는 application.yml을 통해 H2와 connection을 했다. 여기서 url 및 name 설정을 해주었고 hibernate에서 ddl-auto : create로 설정해 실행 할 때마다 DB를 생성해주도록 만들었다.
동작확인
회원 엔티티와 회원 리포지토리를 만들어서 둘을 검사하는 TEST를 실행시켜보았다.
//회원 리포지토리
package jpabook.jpashop;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import org.springframework.stereotype.Repository;
@Repository
public class MemberRepository {
@PersistenceContext
private EntityManager em;
public Long save(Member member){
em.persist(member);
return member.getId();
}
public Member find(Long id){
return em.find(Member.class, id);
}
}
회원 리포지토리로 여기에서는 회원 엔티티를 토대로 member를 저장하는 것과 member를 찾는 것 2개를 만들었다.
//TEST
//TEST를 만드는 것은 ctrl-shift-t이다.
@RunWith(SpringRunner.class)
@SpringBootTest
public class MemberRepositoryTest {
@Autowired MemberRepository memberRepository;
@Test
@Transactional
@Rollback(false)
public void testMember() throws Exception{
Member member = new Member();
member.setUsername("memberA");
Long saveId = memberRepository.save(member); //ctrl-alt-v
Member findMember = memberRepository.find(saveId);
Assertions.assertThat(findMember.getId()).isEqualTo(member.getId());
Assertions.assertThat(findMember.getUsername()).isEqualTo(member.getUsername());
Assertions.assertThat(findMember).isEqualTo(member);
}
}
결과는 당연히도 참이 나온다. 3번째 findMember과 member가 같은 이유는 같은 트랜잭션 안에는 영속성 컨텍스트에 member를 찾은 엔티티가 동일하기 때문에 같게된다. 즉 1차 캐쉬에서 찾아 온것이기 때문에 같은 엔티티이다.
데이터베이스에도 잘 들어간 모습이다. 처음에는 입력값이 들어가지 않았다. 그 이유는 TEST에서는 test가 끝나고 rollBack을 하기 때문이다. 그래서 롤백을 취소해주었더니 성공적으로 데이터가 들어갔다.
'Spring JPA 공부 > 실전! 스프링 부트와 JPA 활용1' 카테고리의 다른 글
웹 계층 개발(회원) (0) | 2023.01.06 |
---|---|
주문 도메인 개발 (0) | 2023.01.05 |
상품 도메인 개발 (0) | 2023.01.04 |
회원 도메인 개발 (0) | 2023.01.04 |
도메인 분석 설계 (0) | 2023.01.03 |