[Spring] 실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 01 프로젝트 환경설정

최효정·2023년 5월 14일
0
post-thumbnail

01-1 프로젝트 생성

스프링 부트 스타터

GENERATE를 눌러 다운로드(→ 적당한 위치에 저장 후 압축 풀기)
IntelliJ IDEA에서 buld.gradle를 import

Settings - Plugins에서 Lombok 설치(IntelliJ 2020.03 이후 버전에서는 기본 Plugin으로 설치되기 때문에 별도의 설치 필요 없음)

잘 설치되었나 확인하기 위해 JpashopApplication 파일 있는 폴더 안에 class 하나 생성

package jpabook.jpashop;

import lombok.Getter;
import lombok.Setter;
@Getter @Setter
public class Hello {
    private String date;
}

main()에 아래 코드 추가

Hello hello = new Hello();
		hello.setData("hello");
		String data = hello.getDate();
		System.out.println("data = " + data);

근데 아까부터 자꾸.. 에러가 났는데 무시하다가 아래 두 링크 보고 해결!
프로젝트 JDK & Geadle JDK 설정

java: cannot find symbol(클래스 import가 안될 때)

출력이 잘 되는 것을 확인했기 때문에 main()에 추가했던 코드 삭제

01-2 라이브러리 살펴보기

01-3 View 환경설정
Thymeleaf
장점: 웹브라우저에서 열린다.
단점: 메뉴얼이 어렵다.
Spring 공식 튜토리얼
Spring Boot 메뉴얼

java / 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은 model에 데이터를 실어 View에 넘길 수 있음
        model.addAttribute("data", "hello!!!"); // data라는 이름의 key에 hello!!!라는 value를 넘김
        return "hello"; // hello 뒤에 .html이 자동으로 붙음 → 결과 화면 rendering할 때 hello.html로 이동
    }
}

스프링 부트 thymeleaf viewName 매핑
resources:templates/ +{ViewName}+ .html

자꾸.. HelloController.java에서 Cannot resolve symbol 'Controller' 라는 에러가 7개나 떠서 아래 링크의 3번째 방법을 따라했더니 해결되었다.^^
Cannot resolve symbol 'Controller' 에러 해결방법

resources / templates / 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>
<!--html상의 렌더링 - '안녕하세요. 손님' 출력, 서버상의 렌더링 - '안녕하세요. hello!!!' 출력-->
</body>
</html>

html로 open


링크텍스트

static / index.html 생성

<!DOCTYPE HTML>
<html>
<head>
  <title>Hello</title>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
Hello
<a href="/hello">hello</a>
</body>
</html>

코드 수정하고 서버를 다시 띄우기 번거롭다.
해결방법
build.gradle의 라이브러리에 devtools 라이브러리 추가
implementation 'org.springframework.boot:spring-boot-devtools'
IntelliJ 컴파일 방법: 메뉴 build - Recompile 후 브라우저 새로고침

devtools 적용이 안돼서 아래 글 보고 해결
링크텍스트
신기하다~ 서버 새로 안열어도 돼서 편함

01-4 H2 데이터베이스 설치
개발이나 테스트 용도로 가볍고 편리한 DB, 웹 화면 제공

데이터베이스 파일 생성 방법
jdbc:h2:~/jpashop (최소 한번)
~/jpashop.mv.db 파일 생성 확인
이후 부터는 jdbc:h2:tcp://localhost/~/jpashop 이렇게 접속

01-5 JPA와 DB 설정, 동작 확인
application.properties 삭제, application.yml 생성

main / resources / application.yml

spring:
  datasource:
    url: jdbc:h2:tcp://localhost/~/jpashop
    username: sa
    password:
    driver-class-name: org.h2.Driver

    jpa:
      hibernate:
        ddl-auto: create
#        spring.jpa.hibernate.ddl-auto: create → 애플리케이션 실행 시점에 테이블을 drop 하고, 다시 생성
      properties:
        hibernate:
          show_sql: true
#          show_sql: System.out 에 하이버네이트 실행 SQL을 남긴다.

          format_sql: true

logging:
  level:
    org.hibernate.SQL: debug
#    org.hibernate.SQL: logger를 통해 하이버네이트 실행 SQL을 남긴다.

참고: 모든 로그 출력은 가급적 로거를 통해 남겨야 한다.

주의! application.yml 같은 yml 파일은 띄어쓰기(스페이스) 2칸으로 계층을 만듭니다. 따라서
띄어쓰기 2칸을 필수로 적어주어야 합니다.
예를 들어서 아래의 datasource 는 spring: 하위에 있고 앞에 띄어쓰기 2칸이 있으므로
spring.datasource 가 됩니다. 다음 코드에 주석으로 띄어쓰기를 적어두었습니다.

java / jpabook.jpashop / Member 생성

package jpabook.jpashop;

import lombok.Getter;
import lombok.Setter;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
@Getter @Setter
public class Member {

    @Id @GeneratedValue
    private Long id;
    private String username;
    
}

java / jpabook.jpashop / MemberRepository 생성

package jpabook.jpashop;

import org.springframework.stereotype.Repository;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@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);
    }

}

Create Test: Shift+Ctrl+T

이렇게 하면 test / java / jpabook.jpashop에 MemberRepositoryTest 생성됨

0개의 댓글