목록전체 글 (659)
겉바속촉

점프투스프링부트 2-12 목표 : 화면에 디자인 적용하기 1. 스태틱(static) 디렉터리 스타일시트 파일은 스프링부트의 스태틱 디렉터리에 저장해야 한다. 스프링부트의 스태틱 디렉터리는 다음과 같다. /sbb/src/main/resources/static 2. 스타일시트 스타일시트 파일은 스태틱 디렉터리에 저장해야 한다. 스타일시트 파일(style.css)을 다음과 같이 작성하자. [파일명:/sbb/src/main/resources/static/style.css] textarea { width:100%; } input[type=submit] { margin-top:10px; } style.css 파일은 질문 상세 화면에 사용하기 위해 작성했다. 답변 등록시 사용하는 텍스트 창의 넓이를 100%로 하고 ..

점프투스프링부트 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) 엔티티에는 최소한 ..

점프투스프링부트 2-03 목표 : JPA 알기 만들어나갈 SBB는 질문 답변 게시판이기 때문에 질문이나 답변을 작성하면 데이터가 생성됨. 그러므로 데이터를 저장하거나 조회하거나 수정하는 등의 기능을 구현해야 한다. 웹 서비스는 데이터를 처리할 때 대부분 데이터베이스를 사용한다. 그런데 데이터베이스를 사용하려면 SQL 쿼리(query)라는 구조화된 질의를 작성하고 실행하는 등의 복잡한 과정이 필요. 이때 ORM(object relational mapping)을 이용하면 자바 문법만으로도 데이터베이스를 다룰 수 있다. 즉, ORM을 이용하면 개발자가 쿼리를 직접 작성하지 않아도 데이터베이스의 데이터를 처리할 수 있다. 1. ORM ORM = Object-Relational Mapping의 약자 SQL 쿼리와..

점프투스프링부트 2-02 목표 : 스프링부트 게시판(SBB)을 만들면서 스프링부트의 기능을 하나씩 알아가기 URL 매핑 이제 본격적으로 SBB 프로그램을 만들어 보자. 목표 : 브라우저에서 http://localhost:8080/sbb 페이지를 요청했을 때 "안녕하세요 sbb에 오신것을 환영합니다."라는 문자열을 출력하도록 만들어 보자. STS의 Boot Dashboard의 시작 버튼을 눌러 로컬서버를 먼저 구동하자. 그리고 그냥 한번 브라우저에서 http://localhost:8080/sbb 페이지를 요청해 보면 다음과 같이 에러메세지창이 뜹니다. 아마 위처럼 "Not found (404)" 라는 오류가 발생할 것이다. 여기서 404는 HTTP 오류코드 중 하나이다. 404 오류는 브라우저가 요청한 페..

점프투스프링부트 2-01 목표 : 스프링부트 프로젝트의 구조와 파일들 이해 현재 SBB 프로젝트는 HelloController.java와 HelloLombok.java 파일만 생성한 상태다. 스프링부트 프로젝트의 전체 구조는 다음과 같다. 1. src/main/java 디렉터리 src/main/java 디렉터리의 com.mysite.sbb 패키지는 자바 파일을 작성하는 공간이다. 자바 파일로는 HelloController와 같은 스프링부트의 컨트롤러, 폼과 DTO, 데이터 베이스 처리를 위한 엔티티, 서비스 파일등이 있다. - SbbApplication.java 파일 모든 프로그램에는 시작을 담당하는 파일이 있다. 스프링부트 애플리케이션에도 시작을 담당하는 파일이 있는데 그 파일이 바로 + Applica..

점프투스프링부트 1-05 목표 : 스프링부트 개발을 도와주는 도구들에 대해서 알아보기 1. Spring Boot Devtools 먼저 스프링부트 로컬 서버를 시작한 후 이전 장에서 작성했던 HelloController를 다음과 같이 수정 2023.02.21 - [IT 일기 (상반기)/SPRING 기초] - [점프투스프링부트] 1-04. 스프링부트 맛보기 [점프투스프링부트] 1-04. 스프링부트 맛보기 점프투스프링부트 1-04 목표 브라우저 주소창에 http://localhost:8080/hello 라는 URL을 입력했을 때 브라우저 화면에 "Hello World"라는 문구를 출력하는 웹 프로그램을 작성해 볼 것 이 프로그램이 동작하 2-juhyun-2.tistory.com Hello World에서 Hel..

점프투스프링부트 1-04 목표 브라우저 주소창에 http://localhost:8080/hello 라는 URL을 입력했을 때 브라우저 화면에 "Hello World"라는 문구를 출력하는 웹 프로그램을 작성해 볼 것 이 프로그램이 동작하기 위해서는 컴퓨터(localhost)가 웹 서버가 되어 8080 포트에서 실행되어야 하고 http://localhost:8080/hello 라는 URL을 통해 서버에 요청이 발생하면 "Hello World" 라는 문구를 브라우저 화면으로 출력해야 한다. 1. HelloController http://localhost:8080/hello 와 같은 브라우저의 요청을 처리하기 위해서는 컨트롤러(Controller)가 필요. 컨트롤러는 서버에 전달된 클라이언트의 요청(URL과 전..