cf)플러그인은 소프트웨어나 앱에 추가되어 특정 기능을 확장하거나 개선하는 도구입니다.
@Controller //시작
public class MainController {
@GetMapping("/sbb") //url 과 자바 매핑
@ResponseBody //리턴값을 문자열 출력
public String index(){
return "안녕하세요 sbb에 오실걸 환영합니다.";}
}

데이터를 관리(저장,수정,삭제,조회)하려면 데이터베이스와 연동하는 JPA 리포지터리가 반드시 필요하다.
JpaRepository<Question, Integer>는 Question 엔티티로 리포지터리를 생성한다는 의미이다. Question 엔티티의 기본키가 Integer임을 이와 같이 추가로 지정해야 한다.
리포지터리를 이용하여 데이터를 저장하려면 질문을 등록하는 화면과 사용자가 입력한 질문 관련 정보를 저장하는 컨트롤러, 서비스 파일 등이 필요하다. 하지만 JUnit을 사용하면 이러한 프로세스를 따르지 않아도 리포지터리만 개별적으로 실행해 테스트해볼 수 있다.
@Autowired 객체를 스프링부트가 자동적으로 주입
리포지터리의 count 메서드는 테이블 행의 개수를 리턴한다.
findById로 호출한 값이 존재할 수도 있고, 존재하지 않을 수도 있어서 리턴 타입으로 Optional이 사용된 것이다.
질문데이터 저장하기
package com.example.JumpToSpring2;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.time.LocalDateTime;
@SpringBootTest
class JumpToSpring2ApplicationTests {
@Autowired
private QuestionRepository questionRepository;
@Test
void contextLoads() {
Question q1 = new Question ();
q1.setSubject ("sbb가 무엇인가요 ?");
q1.setContent ("sbb에대해 알고싶습니다.");
q1.setCreateDate (LocalDateTime.now ());
this.questionRepository.save(q1);
Question q2 = new Question ();
q2.setSubject ("스프링부트 모델 질문입니다.");
q2.setContent("id는 자동으로 생성되나요?");
q2.setCreateDate (LocalDateTime.now ());
this.questionRepository.save(q2);
}
}
db 에 저장하려면 this.questionRepository.save(); 해줘야 저장됌
질문데이터로 답변데이터 찾기 -> @Transactional 해줘야함
@SpringBootTest
class SbbApplicationTests {
@Autowired
private QuestionRepository questionRepository;
@Transactional
@Test
void testJpa() {
Optional<Question> oq = this.questionRepository.findById(2);
assertTrue(oq.isPresent());
Question q = oq.get();
List<Answer> answerList = q.getAnswerList();
// 질문데이터에대한
//답변이 꾸러미이므로 q.getAnswerList() 로 해주고 변수는
//answerList 리턴타입은 List<Answer>
assertEquals(1, answerList.size());
assertEquals("네 자동으로 생성됩니다.", answerList.get(0).getContent());
}
}
@GetMapping("/")
public String root() {
return "redirect:/question/list";
}요청한 URL인 http://localhost:8080/question/detail/2의 숫자 2처럼 변하는 id값을 얻을 때에는 @PathVariable 애너테이션을 사용한다. 이때 @GetMapping(value = "/question/detail/{id}")에서 사용한 id와 @PathVariable("id")의 매개변수 이름이 이와 같이 동일해야 한다
RuntimeException은 실행 시 발생하는 예외라는 의미이다.
@ResponseStatus(value = HttpStatus.NOT_FOUND, reason = "entity not found") 는 DataNotFoundException이 발생할 때 반환될 HTTP 상태 코드와 그 이유