2023. 03. 20 (5 week)

김준태·2023년 3월 20일
0

멋쟁이사자처럼

목록 보기
16/16
post-thumbnail

점프 투 스프링부트

점프 투 스프링부트
00-01~02-12

build.gradle

  • implementation : 프로덕션 코드에서만 사용되는 라이브러리
  • compileOnly : 컴파일 시에만 필요한 라이브러리
  • runtimeOnly : 런타임 시에만 필요한 라이브러리
  • testImplementation : 테스트 코드에서 사용되는 라이브러리
  • testCompileOnly : 테스트 코드를 컴파일 시에만 필요한 라이브러리
  • testRuntimeOnly : 테스트 코드를 런타임 시에만 필요한 라이브러리
dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
	compileOnly 'org.projectlombok:lombok'
	developmentOnly 'org.springframework.boot:spring-boot-devtools'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
	implementation 'nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect'
    
    # mySql & JPA
	runtimeOnly 'com.mysql:mysql-connector-j'
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
}

application.yml

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    								#DB_NAME
    url: jdbc:mysql://127.0.0.1:3306/sbb?serverTimezone=Asia/Seoul
    username: root
    password: 123456789

  jpa:
    hibernate:
      ddl-auto: update
    properties:
      hibernate:
        show-sql: true
        format_sql: true

Question

@Getter
@Setter
@Entity
public class Question {
    @Id
    // 데이터를 저장할 때 해당 속성에 값을 따로 세팅하지 않아도 1씩 자동으로 증가
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    // mappedBy : 참조 엔티티의 속성명을 의미
    // private Question question <---
    // cascade : 질문을 삭제하면 그에 달린 답변들도 모두 함께 삭제
    @OneToMany(mappedBy = "question", cascade = CascadeType.REMOVE)
    private List<Answer> answerList;
}

Answer

@Getter
@Setter
@Entity
public class Answer {
    @ManyToOne
    // @ManyToOne은 N:1 관계
    // Answer 엔티티의 question 속성과 Question 엔티티가 서로 연결
 	// 데이터베이스에서는 ForeignKey 관계가 생성
    private Question question;
}

QuestionRepository

  • 엔티티에 의해 생성된 데이터베이스 테이블에 접근하는 메서드들(예: findAll, save 등)을 사용하기 위한 인터페이스
  • CRUD를 어떻게 처리할지 정의하는 계층
// Question 엔티티의 PK(Primary Key) 속성인 id의 타입은 Integer 이다.
public interface QuestionRepository extends JpaRepository<Question, Integer> {
}

QuestionController

//final이 붙은 속성을 포함하는 생성자를 자동으로 생성하는 역할
@RequiredArgsConstructor
@Controller
public class QuestionController {

    private final QuestionRepository questionRepository;

    @GetMapping("/question/list")
    public String list(Model model) {
        List<Question> questionList = this.questionRepository.findAll();
        model.addAttribute("questionList", questionList);
        return "question_list";
    }
    // 
    @GetMapping(value = "/question/detail/{id}")
    // 변하는 id 값을 얻을 때에는 위와 같이 @PathVariable 애너테이션을 사용
    public String detail(Model model, @PathVariable("id") Integer id) {
        return "question_detail";
    }
}
}

question_list.html

Thymeleaf(타임리프)

<table>
    <thead>
        <tr>
            <th>제목</th>
            <th>작성일시</th>
        </tr>
    </thead>
    <tbody>
        <tr th:each="question, index : ${questionList}">
            <td>
           자바 객체의 값을 더할 때는 반드시 다음처럼 |과 | 기호로 좌우를 감싸 주어야 한다.
                <a th:href="@{|/question/detail/${question.id}|}" th:text="${question.subject}"></a>
            </td>
            <td th:text="${question.createDate}"></td>
        </tr>
    </tbody>
</table>

0개의 댓글