목록IT 일기 (상반기)/SPRING 기초 (42)
겉바속촉
점프투스프링부트 2-11 목표 : 질문에 답변을 등록하고 보여주는 기능 만들기 1. 답변 등록 버튼 만들기 질문 상세 템플릿에 답변 저장을 위한 form, textarea, input 엘리먼트를 다음과 같이 추가하자. [파일명:/sbb/src/main/resources/templates/question_detail.html] 버튼을 누르면 전송되는 form의 action은 타임리프의 "th:action" 속성으로 생성한다. 위와 같이 추가하고 질문 상세 페이지에 접속해 보자. 답변을 입력할 수 있는 텍스트창과 버튼이 생성되었다. 이제 버튼을 누르면 POST 방식으로 /answer/create/ URL이 호출(submit)될 것이다. 하지만 아직 /answer/create/ URL에 대한 매핑이 없으므로 ..
점프투스프링부트 2-10 목표 : 질문 상세 기능 추가 1. 질문 상세 링크 추가하기 먼저 질문 목록의 제목을 클릭했을때 상세화면이 호출되도록 제목에 링크를 추가하자. 질문 목록 템플릿을 다음과 같이 수정하자. [파일명: /sbb/src/main/resources/templates/question_list.html] 제목 작성일시 제목을 엘리먼트의 텍스트로 출력하던 것에서 링크로 변경했다. 타임리프에서 링크의 주소는 th:href 속성을 사용한다. 타임리프에서 th:href 처럼 URL 주소를 나타낼때는 반드시 @{ 문자와 } 문자 사이에 입력해야 한다. 그리고 URL 주소는 문자열 /question/detail/과 ${question.id} 값이 조합되어 /question/detail/${questio..
점프투스프링부트 2-09 목표 : 서비스 만들기 이제 질문 목록의 제목 링크를 누르면 질문 상세 화면이 보이게 할 것이다. 하지만 기능을 추가하기 전에 잠시 생각할 것이 있다. 우리는 QuestionController에서 QuestionRepository를 직접 사용하여 질문 목록 데이터를 조회했다. 하지만 대부분의 규모있는 스프링부트 프로젝트는 컨트롤러에서 리포지터리를 직접 호출하지 않고 중간에 서비스(Service)를 두어 데이터를 처리한다. 서비스는 스프링에서 데이터 처리를 위해 작성하는 클래스이다. 1. 서비스가 필요한 이유 서비스가 필요한 이유는 무엇일까? - 모듈화 예를들어 어떤 컨트롤러가 여러개의 리포지터리를 사용하여 데이터를 조회한후 가공하여 리턴한다고 가정해 보자. 이러한 기능을 서비스로..
점프투스프링부트 2-08 목표 : 루트 URL 만들기 루트 URL은 http://localhost:8080 처럼 도메인명과 포트 뒤에 아무것도 붙이지 않은 URL을 말한다. 우리는 아직 루트 URL에 대한 매핑을 만들지 않았기 때문에 브라우저에서 루트 URL에 접속하면 다음과 같은 404 페이지가 나타난다. 이번에는 루트 URL 호출시 404 페이지 대신 질문 목록을 출력하도록 해보자. 다음과 같이 MainContrller를 수정하자. root 메서드를 추가하고 / URL을 매핑했다. 리턴 문자열 redirect:/question/list는 /question/list URL로 페이지를 리다이렉트 하라는 명령어이다. 스프링부트는 리다이렉트 또는 포워딩을 다음과 같이 할 수 있다. redirect: - UR..
점프투스프링부트 2-07 목표 : SBB의 핵심 기능인 질문 목록을 구현 우리가 원하는 질문 목록은 다음 주소에 접속할 때 동작해야 한다. 로컬 서버를 실행하고 웹 브라우저에서 http://localhost:8181/question/list에 접속해 보자. 아마 다음과 같은 404 오류페이지가 나타날 것이다. 1. 404 오류 해결하기 404 오류를 해결하려면 /question/list URL에 대한 매핑이 있는 컨트롤러가 필요하다. QuestionController.java 파일을 다음과 같이 신규 작성하자. [파일명:/sbb/src/main/java/com/mysite/sbb/question/QuestionController.java] package com.mysite.sbb.question; imp..
점프투스프링부트 Error 패키지 생성하고 파일들 옮겨주면서 import 경로가 꼬이기 시작했다... 그러면서 서버가 재기동이 되지 않기 시작해따...😢😢😢 every '@Entity' class must declare or inherit at least one '@Id' or '@EmbeddedId' property 라는 문구를 보여주기 시작했고 그때부터 열심히 구글링을 한 결과 해당 클래스의 @Id 어노테이션 항목을 봐야함을 알게되었다 기존에는 import org.springframework.data.annotation.Id; 라고 되어 있었으나 다음과 같이 고쳐주어야 함 import jakarta.persistence.Id; 그럼 재기동 깨끗하게 잘된다 근데 왜인지 찾아보니 스프링부트 버전 문제인 ..
점프투스프링부트 2-06 목표 : 도메인 별로 분류 하나의 패키지 안에 모든 자바파일을 넣고 관리하는 것은 바람직하지 않으므로 SBB는 도메인별로 패키지를 나누어 자바파일을 관리할 예정. 도메인은 "질문", "답변" "사용자" 처럼 굵직한 요구사항 또는 문제 영역을 대표하는 말이다. 따라서 SBB 프로젝트의 도메인은 다음과 같이 구성할수 있다. question - 질문 (com.mysite.sbb.question) answer - 답변 (com.mysite.sbb.answer) user - 사용자 (com.mysite.sbb.user) 이와 같은 기준으로 패키지를 생성하고 패키지에 맞도록 해당 파일들을 이동해 보자. 끄으으읕 ^_________^ 파일들이 깔끔해진 느낌!
점프투스프링부트 2-05 목표 : JPA를 활용한 데이터 처리 1. 리포지터리 엔티티만으로는 데이터베이스에 데이터를 저장하거나 조회 할 수 없다. 데이터 처리를 위해서는 실제 데이터베이스와 연동하는 JPA 리포지터리가 필요하다. 리포지터리는 엔티티에 의해 생성된 데이터베이스 테이블에 접근하는 메서드들(예: findAll, save 등)을 사용하기 위한 인터페이스이다. 데이터 처리를 위해서는 테이블에 어떤 값을 넣거나 값을 조회하는 등의 CRUD(Create, Read, Update, Delete)가 필요하다. 이 때 이러한 CRUD를 어떻게 처리할지 정의하는 계층이 바로 리포지터리이다. 다음과 같이 QuestionRepository 인터페이스를 생성하자. [파일명:/sbb/src/main/java/com..
점프투스프링부트 2-04 목표 : 엔티티 이해하기 엔티티 👉 데이터베이스 테이블과 매핑되는 자바 클래스를 말한다. SBB는 질문과 답변을 할 수 있는 게시판 서비스이다. 따라서 SBB에는 질문과 답변에 해당하는 엔티티가 있어야 한다. 엔티티는 모델 또는 도메인 모델이라고 부르기도 한다. 여기서는 이것들을 구분하지 않고 테이블과 매핑되는 클래스를 엔티티라 지칭하겠다. 1. 엔티티의 속성 구상하기 그렇다면 질문과 답변 엔티티에는 어떤 속성들이 필요한지 먼저 생각해 보자. 질문(Question) 엔티티에는 최소한 다음과 같은 속성이 필요하다. 속성명 설명 id 질문의 고유 번호 subject 질문의 제목 content 질문의 내용 create_date 질문을 작성한 일시 답변(Answer) 엔티티에는 최소한 ..