프로젝트 환경설정
- 프로젝트 생성
- 라이브러리 살펴보기
- View 환경 설정
- H2 데이터베이스 설치
- JPA와 DB 설정, 동작확인
프로젝트 생성
- 스프링 부트 스타터(https://start.spring.io/)
- 사용 기능 : web, thymeleaf, jpa, h2, lonbok, validation
- groupId : jpabook
- artifactId : jpashop
스프링 부트 스타터 설정 필독!
스프링 부트 버전은 2.4.x 버전을 선택해주세요.
자바 버전은 11을 선택해주세요
Validation (JSR-303 validation with Hibernate validator) 모듈을 꼭! 추가해주세요.
사용 기능
- web
- RESTful api, Spring MVC, Apache Tomcat 내장하고 있기 때문에 웹 애플리케이션을 만들 땐 꼭 추가해야되는 Dependency 입니다.
- thymeleaf
- view template입니다.
- jsp를 사용하지 않는 이유는 성능면에서 좋지 않고, 스프링 부트에서도 권장하지 않기 때문입니다.
- jpa
- Java Persistence API의 약자로 Spring Data와 Hibernate를 사용하는 ORM 표준 기술입니다.
- h2
- MySQL과 같은 좋은 데이터베이스가 많지만, h2를 사용하는 이유는 MySQL은 설치하거나 하는 부분에서 까다롭고 강의의 목적이 아니기 때문에 강의에 좀 더 집중하기 위해 사용합니다.
- h2는 간단하게 웹 애플리케이션 실행할 때 데이터베이스를 내장해서 실행할 수 있고, 간단하게 교육용으로 장점이 많다고 합니다.
- lombok
- 지루하게 반복하는 코드를 줄여줍니다.
- 예를들면, getter, setter 같은 경우 직접 코드를 작성하지 않고 @getter, @setter과 같은 어노테이션만 추가하면 기능을 사용할 수 있게 해줍니다. (사용해봤는데 정말 편리한 라이브러리인 것 같습니다.)
Lombok 설정
lombok을 사용하기 위해선 아래와 같은 설정을 해주어야합니다.
- preference -> plugins -> lombok 검색 후 설치
- preference -> annotation processors -> enable annotation processing 체크
스프링 부트 라이브러리 살펴보기
- spring-boot-starter-web
- spring-boot-starter-tomcat : 톰캣 (웹서버)
- spring-webmvc : 스프링 웹 MVC
- spring-boot-starter-thymeleaf : 타임리프 템플릿 엔진(View)
- spring-boot-starter-data-jpa
- spring-boot-starter-aop
- spring-boot-starter-jdbc
- HikariCP 커넥션 풀 (부트 2.0 기본)
- hibernate + JPA : 하이버네이트 + JPA
- spring-data-jpa : 스프링 데이터 JPA
- spring-boot-starter : 스프링 부트 + 스프링 코어 + 로깅
- spring-boot
- spring-core
- spring-boot-starter-logging
- logback, slf4j
- spring-boot
테스트 라이브러리
- spring-boot-starter-test
- junit : 테스트 프레임워크 (자바 테스트)
- mockito : 목 라이브러리
- assertj : 테스트 코드를 좀 더 편하게 작성하게 도와주는 라이브러리 (보통 원하는 값과 결과 값이 일치하는지 테스트할 때 많이 써봄)
- spring-test : 스프링 통합 테스트 지원
- 핵심 라이브러리
- 스프링 MVC
- 스프링 ORM
- JPA, Hibernate
- 스프링 데이터 JPA
- 기타 라이브러리
- h2 데이터베이스 클라이언트
- 커넥션 풀 : 부트 기본은 HikariCP
- WEB(thymeleaf)
- 로깅 SLF4J & LogBack
- 테스트
참고 : 스프링 데이터 JPA는 스프링과 JPA를 먼저 이해하고 사용해야 하는 응용기술
View 환경 설정
thymeleaf 템플릿 엔진
- thymeleaf 공식 사이트 : https://www.thymeleaf.org/
- 스프링 공식 튜토리얼 : https://spring.io/guides/gs/serving-web-content/
- 스프링부트 메뉴얼 : https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-developing-web-applications.html#boot-features-spring-mvc-template-engines
- 스프링 부트 thymeleaf viewName 매핑
- resources : templeates/ + {ViewName} + .html
@Controller
public class HelloController {
@GetMapping("hello")
public String hello(Model model){
model.addAttribute("data", "hello!!!!");
return "hello";
}
}
thymeleaf 템플릿 엔진 동작 확인 (hello.html)
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Hello</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<p th:text="'안녕하세요. ' + ${data}" >안녕하세요. 손님</p>
</body>
</html>
위치 : resources/templates/hello.html
참고 : spring-boot-devtools 라이브러리를 추가하면, html 파일을 컴파일만 해주면 서버 재시작 없이 View 파일 변경이 가능합니다.
인텔리제이 컴파일 방법 : 메뉴 Build -> Recompile
implementation 'org.springframework.boot:spring-boot-devtools' << 를 build.gradle에 추가해주면 됩니다.
H2 데이터베이스 설치
- https://www.h2database.com
- 다운로드 및 설치
- 데이터베이스 파일 생성 방법
- jdbc:h2:~/jpashop (최소 한번)
- ~/jpashop.mv.db 파일 생성 확인
- 이후 부터는 jdbc:h2:tcp://localhost/~/jpashop 이렇게 접속
참고!
H2 데이터베이스는 꼭 1.4.199 버전 사용
실행할 때, permission denied된다면 "chmod 755 h2.sh" 친 다음 ./h2.sh로 실행
JPA와 DB 설정, 동작확인
김영한님은 application.properties 대신 yaml인 application.yaml을 사용하신다. 개인적으로 더 편리하다고 합니다. application.properties를 삭제하고 application.yml을 생성한 뒤 아래 코드를 추가해줍니다.
spring:
datasource:
url: jdbc:h2:tcp://localhost/~/jpashop
username: sa
password:
driver-class-name: org.h2.Driver
jpa:
hibernate:
ddl-auto: create
properties:
hibernate:
#show_sql: true
format_sql: true
logging.level:
org.hibernate.SQL: debug
- spring.jpa.hibernate.ddl-auto : create
- 애플리케이션 실행 시점에 테이블을 drop하고, 다시 생성한다는 의미입니다.
참고: 모든 로그 출력은 가급적 로거를 통해 남겨야 합니다.
show_sql 옵션은 System.out에 하이버네이트 실행 SQL을 남기는 것이고,
org.hibernate.SQL 옵션은 logger를 통해 하이버네이트 실행 SQL을 남기는 것 입니다.
그렇기 때문에 show_sql은 주석처리해주었고, org.hibernate.SQL을 통해 로거로 로그를 확인할 수 있도록 했습니다.
yml 코드 작성법 등을 보고싶으면 아래 링크를 통해 레퍼런스 자료를 찾아보시는 걸 추천드립니다.
실제 동작하는지 확인하기
회원 엔티티
@Entity
@Getter
@Setter
public class Member {
@Id
@GeneratedValue
private Long id;
private String username;
}
회원 리포지토리
@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);
}
}
테스트
@RunWith(SpringRunner.class)
@SpringBootTest
public class MemberRepositoryTest {
@Autowired
MemberRepository memberRepository;
@Test
@Transactional
@Rollback(false)
public void testMember() throws Exception {
//given
Member member = new Member();
member.setUsername("memberA");
//when
Long saveId = memberRepository.save(member);
Member findMember = memberRepository.find(saveId);
//then
Assertions.assertThat(findMember.getId()).isEqualTo(member.getId());
Assertions.assertThat(findMember.getUsername()).isEqualTo(member.getUsername());
}
}
- @Transactional
- Entity 변경 작업은 모두 트랜잭션 내에서만 이루어져야합니다. Member는 Entity이기 때문에 Transactional을 추가하지 않으면 에러가 뜨게됩니다.
- 해당 어노테이션이 테스트에있으면 테스트가 끝난다음 바로 롤백을 하기 때문에 h2에 데이터가 남아있지 않습니다.
- @Rollback(false)
- 위의 트랜잭셔널 어노테이션이 테스트에 있으면 바로 롤백이되어 h2-console에서 입력한 데이터를 볼 수 없습니다.
- 이러한 경우 위의 @Rollback(false) 어노테이션을 추가해주면 h2-console에서 입력한 데이터를 볼 수 있습니다.
주의! @Test는 JUnit4를 사용하시면 org.junit.Test를 사용해야 합니다. 만약 JUnit5 버전을 사용하면 그것에 맞게 사용하면 됩니다.
- Entity, Repository 동작확인
- jar 빌드해서 동작 확인
쿼리 파라미터 로그 남기기
- 김영한님 피셜로 어마어마한 꿀팁이라고 합니다. 개발할 때 엄청 편리하다고 합니다. jpa로 쓰면 답답한게 sql 나가는거랑 데이터베이스 커넥션 가져오는게 어느 타이밍에 되는지 궁금할 때가 많은데 이러한 궁금증을 해결해준다고합니다.
- 로그에 다음을 추가하기 org.hibernate.type : SQL 실행 파라미터를 로그로 남긴다.
- 외부 라이브러리 사용
스프링 부트를 사용하면 아래 라이브러리만 추가하면 됩니다.
implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.6'
참고 : 쿼리 파라미터를 로그로 남기는 외부 라이브러리는 시스템 자원을 사용하므로, 개발 단계에서는 편하게 사용해도 됩니다. 하지만 운영 시스템에 적용하려면 꼭 성능테스트를 하고 사용하는 것이 좋습니다.
출처
'spring > 인프런 강의 정리' 카테고리의 다른 글
[JPA 활용 1] 3. 애플리케이션 구현 준비 (0) | 2022.04.17 |
---|---|
[JPA 활용 1] 2. 도메인 분석 설계 (0) | 2022.04.17 |
[JPA 기본편] 10. 객체지향 쿼리 언어 (0) | 2022.04.02 |
[JPA 기본편] 9. 값 타입 (0) | 2022.03.24 |
[JPA 기본편] 8. 프록시와 연관관계 관리 (0) | 2022.03.15 |