점프 투 스프링부트
00-01~02-12
- 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'
}
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
@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;
}
@Getter
@Setter
@Entity
public class Answer {
@ManyToOne
// @ManyToOne은 N:1 관계
// Answer 엔티티의 question 속성과 Question 엔티티가 서로 연결
// 데이터베이스에서는 ForeignKey 관계가 생성
private Question question;
}
// Question 엔티티의 PK(Primary Key) 속성인 id의 타입은 Integer 이다.
public interface QuestionRepository extends JpaRepository<Question, Integer> {
}
//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";
}
}
}
<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>