점프투스프링부트 2장 요약

이동원·2024년 4월 16일

2장 요약

2-01 스프링 부트 프로젝트 구조 이해하기

  • application.properties 파일은 sbb 프로젝트의 환경을 설정한다
  • build.gradle 파일에는 프로젝트에 필요한 플러그인과 라이브러리를 설치하기 위한 내용을 작성한다.

cf)플러그인은 소프트웨어나 앱에 추가되어 특정 기능을 확장하거나 개선하는 도구입니다.

2-02 간단한 웹 프로그램 만들기

@Controller //시작
public class MainController {
    @GetMapping("/sbb") //url 과 자바 매핑
    @ResponseBody //리턴값을 문자열 출력
    public String index(){
        return "안녕하세요 sbb에 오실걸 환영합니다.";}
}

2-03 JPA로 데이터베이스 사용하기(H2 데이터베이스 ,JPA설정)

  • 대부분의 웹 서비스들은 생성되는 데이터를 관리하고 처리하기 위해 데이터베이스를 사용한다
  • 데이터베이스를 관리하려면 SQL(Structured Query Language)이라는 언어를 사용해야 한다
  • 스프링 부트와 달리 데이터베이스는 자바를 이해하지 못한다. 하지만 ORM(Object Relational Mapping)이라는 도구를 사용하면 자바 문법으로도 데이터베이스를 다룰 수 있다
  • JPA는 자바 표준 ORM(Object-Relational Mapping) 기술 중 하나다. (인터페이스 모음)
    대표적으로 하이버네이트가 있다.
  • 인터페이스(interface)란 클래스가 구현해야 하는 메서드 목록을 정의한 틀이다.
  • H2 데이터베이스 :H2 데이터베이스는 주로 개발 환경에서 사용하는 자바 기반의 경량 DBMS이다.
  • implementation이란?
    build.gradle 파일에서 작성한 implementation은 필요한 라이브러리 설치를 위해 가장 일반적으로 사용하는 설정이다. implementation은 해당 라이브러리가 변경되더라도 이 라이브러리와 연관된 모든 모듈을 컴파일하지 않고 변경된 내용과 관련이 있는 모듈만 컴파일하므로 프로젝트를 리빌드(rebuild)하는 속도가 빠르다.

2-04 엔티티로 테이블 매핑하기

  • 질문 , 답변 엔티티 테이블 메핑하기
  • private List< Answer > answerList;는 Question 엔티티가 여러 개의 Answer를 가질 수 있는데, 이를 리스트 형태로 저장하는 변수를 선언한 것입니다.
  • mappedBy는 참조 엔티티의 속성명을 정의한다. 즉, Answer 엔티티에서 Question 엔티티를 참조한 속성인 question을 mappedBy에 전달해야 한다.

2-05 리포지토리로 데이터베이스 관리하기

  • 데이터를 관리(저장,수정,삭제,조회)하려면 데이터베이스와 연동하는 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());
    }
}

2-06 도메인별로 정리하기

  • 패키지로 answer ,question ,user로 보기쉽게 분류하기

2-07 질문목록 만들기

  • 템플릿은 자바 코드를 삽입할 수 있는 HTML 형식의 파일을 말한다->템플릿 엔진 중 타임리프사용
  • QuestionRepository로 조회한 질문 목록 데이터는 Model 클래스를 사용하여 템플릿에 전달할 수 있다.
  • Model 객체에 값을 담아 두면 템플릿에서 그 값을 사용할 수 있다. Model 객체는 따로 생성할 필요 없이 컨트롤러의 메서드에 매개변수로 지정하기만 하면 스프링 부트가 자동으로 Model 객체를 생성한다.
  • @RequiredArgsConstructor는 롬복(Lombok)이 제공하는 애너테이션으로, final이 붙은 속성을 포함하는 생성자를 자동으로 만들어 주는 역할을 한다 (반드시 필요한 것)
  • @RequiredArgsConstructor // 만드는과정 중 객체를 자동 주입 바로 autowired 는 다만들고서 객체주입
  • Model 객체는 따로 생성할 필요 없이 컨트롤러의 메서드에 매개변수로 지정하기만 하면 스프링 부트가 자동으로 Model 객체를 생성한다.

2-08 루트URL 사용하기

  • 서버의 URL을 요청할 때 도메인명 뒤에 아무런 주소도 덧붙이지 않는 URL을 루트 URL이라고 한다
      @GetMapping("/")
     public String root() {
        return "redirect:/question/list";
      }

2-09 서비스 활용하기

  • 우리는 그동안 QuestionController에서 QuestionRepository를 직접 접근해 질문 목록 데이터를 조회했다. 하지만 대부분의 규모 있는 스프링 부트(Spring Boot) 프로젝트는 컨트롤러에서 리포지터리를 직접 호출하지 않고 중간에 서비스를 두어 데이터를 처리한다.

2-10 상세 페이지 만들기

  • 요청한 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 상태 코드와 그 이유

2-11 URL 프리픽스 알아두기

  • @RequestMapping("/question")은 "/question"으로 시작하는 모든 URL 요청을 해당 컨트롤러 클래스의 메서드로 라우팅합니다. 즉, 이 컨트롤러 클래스는 "/question"으로 시작하는 모든 요청을 처리합니다.

2-12 답변 기능 만들기

  • GET 요청은 주로 데이터를 가져오는 데 사용되며, POST 요청은 데이터를 전송하거나 만들때 사용된다.
  • @RequestParam은 클라이언트가 보낸 데이터를 가져오는 도구입니다. 주로 URL 쿼리 문자열이나 POST 요청의 form 데이터에서 파라미터 값을 가져올 때 사용됩니다.

2-13 웹 페이지 디자인하기

  • 스타일시트 파일, 즉 CSS 파일은 HTML 파일과 달리 스태틱(static) 디렉터리에 저장해야 한다

2-14 부트스트랩으로 화면 꾸미기

  • 웹 디자이너의 도움 없이도 개발자 혼자서 상당히 괜찮은 수준의 웹 페이지를 만들 수 있게 도와주는 프레임워크이다

2-15 표준 HTML 구조로 변경하기

  • 어떤 웹 브라우저를 사용하더라도 웹 페이지가 동일하게 보이고 정상적으로 작동하게 하려면 반드시 웹 표준을 지키는 HTML 문서로 작성해야 한다.

2-16 질문 등록 기능 추가하기

  • 우리는 질문을 등록하는 기능을 구현했다. 하지만 질문을 등록할 때 비어 있는 값으로도 등록할 수 있다는 점을 간과했다. 아무것도 입력하지 않은 상태에서 질문이 등록될 수 없도록 하려면 여러 방법이 있지만 여기서는 폼 클래스를 사용하여 입력값을 체크하는 방법을 사용해 보자.
  • @NotEmpty는 해당 값이 Null 또는 빈 문자열("")을 허용하지 않음을 의미한다
  • 바인딩이란 템플릿의 항목과 form 클래스의 속성이 매핑되는 과정을 말한다.

0개의 댓글