스프링 웹 사이트 만들기 | Spring Mvc (스프링 웹 Mvc) 강의 03 – 메이븐을 이용한 기본 웹 프로젝트 생성하기 381 명이 이 답변을 좋아했습니다

당신은 주제를 찾고 있습니까 “스프링 웹 사이트 만들기 – Spring MVC (스프링 웹 MVC) 강의 03 – 메이븐을 이용한 기본 웹 프로젝트 생성하기“? 다음 카테고리의 웹사이트 you.tfvp.org 에서 귀하의 모든 질문에 답변해 드립니다: https://you.tfvp.org/blog/. 바로 아래에서 답을 찾을 수 있습니다. 작성자 뉴렉처 이(가) 작성한 기사에는 조회수 23,006회 및 좋아요 294개 개의 좋아요가 있습니다.

설명
  1. 템플릿 엔진이 X –> HTML내에 Java코드를 삽입해서 동적 페이지를 생성하는 서버사이드 스크립트 언어
  2. Java Servlet으로 변환되어 실행 O.
  3. 배포를 위해 WAR(Web Application Archive) 타입이 사용 (JAR에 비해 무거움)

스프링 웹 사이트 만들기 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 Spring MVC (스프링 웹 MVC) 강의 03 – 메이븐을 이용한 기본 웹 프로젝트 생성하기 – 스프링 웹 사이트 만들기 주제에 대한 세부정보를 참조하세요

좋아요! 구독! \”안해도\” 됩니다.
진짜 언제 지워질지 모르는 강의입니다.
도움이 되는 분들은 보시고 아님 마시길…
이 강의는 스프링 웹 MVC과 스프링 부트 과정입니다.
현재는 스프링의 사전 과목인 데이터베이스와 Servlet/JSP 등을 병행해서 올리고 있습니다.
감사합니다.
이 강의를 제공하는 \”뉴렉(newlec)\”쌤은 통신모듈, COM 콤포넌트 개발, 게임, 보안 모듈 개발을 시작으로 지금은 웹 개발을 주로 하고 있으며 (주)철도청, (주)하나은행, (주)삼표 등의 기업 강의를 거쳐서 지금은 http://www.newlecture.com 에서 온라인 강의를 진행하고 있습니다.

스프링 웹 사이트 만들기 주제에 대한 자세한 내용은 여기를 참조하세요.

02. Spring 웹 사이트 만들어보기!(feat. 스프링 MVC 하루만에 …

1. 책 입력화면 만들기! 01. 책 입력 화면 개요! 책 정보를 입력하기 위한 화면을 만든다; 브라우저에서 /create 주소에 접속하면 …

+ 자세한 내용은 여기를 클릭하십시오

Source: velog.io

Date Published: 8/18/2021

View: 4625

[Spring] 4. 웹사이트 만들기 ③ : 회원 신규 등록, 회원 정보 수정 …

교육 중에 작성한 예제들은 깃허브에 올려두고 있습니다. gif 파일은 클릭해서 보는 것이 정확합니다. – 웹사이트 만들기 ③ : 회원 신규 등록, 회원 정보 …

+ 여기에 표시

Source: upcake.tistory.com

Date Published: 3/7/2022

View: 8565

스프링 MVC- 웹 페이지 만들기 – Catsbi’s DLog

스프링 MVC- 웹 페이지 만들기 … https://github.com/catsbi/spring-mvc-shoping … 부트 스트랩은 웹사이트를 쉽게 만들 수 있도록 도와주는 HTML, CSS, …

+ 더 읽기

Source: catsbi.oopy.io

Date Published: 10/12/2021

View: 6509

spring mvc homepage 스프링 홈페이지 만들기 1 – 꿈꾸는 자

spring mvc homepage 스프링 홈페이지 만들기 1. 스프링을 이용하여 홈페이지를 제작해볼 예정입니다. 최대한 간단하게 필요한 결과 위주로 구성해볼 …

+ 여기에 자세히 보기

Source: s00741.tistory.com

Date Published: 10/3/2022

View: 145

spring boot 로 웹사이트 만들기

웹서비스를 하나 만들려고 한다. 오픈소스, 무료 서비스만 이용하고 서버운영시 과금없는 서비스를 우선 목표로 했다. 학원 운영자가 사용할 회원 …

+ 여기에 표시

Source: emflant.tistory.com

Date Published: 6/3/2022

View: 1598

SPRING BOOT를 이용한 나의 첫 웹페이지 제작 (1)

프론트앤드 개발은 웹페이지 사용자가 직접 눈으로 보게되는 사이트의 디자인, 즉 VIEW를 만드는 … 스프링부트를 이용한 웹페이지 만들기 도전!!/

+ 여기를 클릭

Source: hihaoun.tistory.com

Date Published: 9/26/2022

View: 853

스프링부트+jsp로 배달사이트 만들기-01 프로젝트 생성 – sumin

스프링부트+ jsp + mybatis로 배달 사이트 만드는 과정입니다. sts4, 오라클, maven을 사용합니다. 혼자서 프로젝트를 만드는 과정을 올린 것이니 …

+ 더 읽기

Source: sumin2.tistory.com

Date Published: 4/25/2021

View: 9026

스프링으로 홈페이지 만들기 #2 (프로젝트 생성 및 설정)

스프링으로 홈페이지 만들기 #1 (설치 및 설정) … 이클립스의 파생으로, Spring MVC 프로젝트를 개발하기 위한 여러가지 플러그인?

+ 여기에 자세히 보기

Source: tuta.tistory.com

Date Published: 4/6/2022

View: 6544

[Inflearn] 스프링 MVC (8) 웹 페이지 만들기 – UL의 개발 블로그

[Inflearn] 스프링 MVC (8) 웹 페이지 만들기. UL 🙂 2022. 3. 7. 18:18. 김영한 강사님의 ‘스프링 MVC 1편 – 백엔드 웹 개발 핵심 기술’ 강의 정리.

+ 여기에 더 보기

Source: stella-ul.tistory.com

Date Published: 11/19/2021

View: 2755

주제와 관련된 이미지 스프링 웹 사이트 만들기

주제와 관련된 더 많은 사진을 참조하십시오 Spring MVC (스프링 웹 MVC) 강의 03 – 메이븐을 이용한 기본 웹 프로젝트 생성하기. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

Spring MVC (스프링 웹 MVC) 강의 03 - 메이븐을 이용한 기본 웹 프로젝트 생성하기
Spring MVC (스프링 웹 MVC) 강의 03 – 메이븐을 이용한 기본 웹 프로젝트 생성하기

주제에 대한 기사 평가 스프링 웹 사이트 만들기

  • Author: 뉴렉처
  • Views: 조회수 23,006회
  • Likes: 좋아요 294개
  • Date Published: 최초 공개: 2020. 10. 6.
  • Video Url link: https://www.youtube.com/watch?v=Y7zBLC28DGM

웹 페이지 만들기 :: 개발자 한선우

@PostMapping

(

“/add”

)

public

String

addItemV5

(

Item

item

)

{

itemRepository

.

save

(

item

);

/* Path Variable로 추가되는 item의 id와 같은 변수를 추가적으로 인코딩 되지 않음 */

return

“redirect:/basic/items/”

+

item

.

getId

();

}

02. Spring 웹 사이트 만들어보기!(feat. 스프링 MVC 하루만에 배우기)

1. 책 입력화면 만들기!

01. 책 입력 화면 개요!

책 정보를 입력하기 위한 화면을 만든다

브라우저에서 /create 주소에 접속하면 책 정보를 입력할 수 있는 화면을 보여준다.

02. 책 컨트롤러 클래스 생성

브라우저를 비롯한 클라이언트의 요청을 받아서 응답을 만들어내는 컨트롤러 클래스를 생성

@Controller 어노테이션 추가! @Controller 어노테이션이 있는 클래스는 스프링이 브라우저의 요청을 받아들이는 컨트롤러라고 인지해서 자바 빈으로 등록해서 관리

03. 책 생성 화면 컨트롤러 메소드 작성

브라우저 주소가 /create일때 실행되는 자바 컨트롤러 메소드를 작성

package sample.spring.yse; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; @Controller public class BookController { @RequestMapping(value = “/create”, method = RequestMethod.GET) public ModelAndView create() { return new ModelAndView(“book/create”); } }

@RequestMapping 어노테이션은 브라우저의 요청에 실행되는 자바 메소드를 지정 value 속성은 브라우저의 주소(URL)를 지정 method 속성은 http 요청 메소들를 의미 GET 메소드는 데이터를 변경하지 않는 경우(select) Post 메소드는 데이터가 변경될 경우 사용(insert, delete, update)

이 경우 화면을 보여주는 경우는 GET을 사용

ModelAndView는 컨트롤러가 반환할 데이터를 담당하는 모델(Model)과(And)화면을 담당하는 뷰(View)의 경로를 합쳐놓은 객체 생성자에 문자열 타입 파라미터가 입력되면 뷰의 경로라고 간주

따라서 create 메소드는 브라우저에서 /create 주소가 GET방식으로 입력되었을 때 book/create 경로의 뷰를 보여준다

04. 책 생성 화면 뷰 생성

책 생성 컨트롤러에서 book/create 경로를 반환했으므로, 실제 화면을 담당하는 뷰 코드를 작성, 최종 경로는 src/main/webapp/web-inf/views/book/create.jsp

05. 책 생성 화면 뷰 내용작성

<%@ page pageEncoding="UTF-8" contentType="text/html;charset=utf-8"%> < html > < head > < title > 책 생성하기 < body > < h1 > 책 생성하기 < form method = " POST " > < p > 제목 : < input type = " text " name = " title " /> < p > 카테고리 : < input type = " text " name = " category " /> < p > 가격 : < input type = " text " name = " price " /> < p > < input type = " submit " value = " 저장 " />

뷰는 화면을 담당

웹 어플리케이션에서 화면은 웹 브라우저가 렌더링하므로 브라우저가 읽어서 해석할 수 있는 HTML로 최종 변환할 수 있도록 작성한다!

서버로 전달되는 키 : 값 쌍을 HTTP 파라미터라고 부른다

06. 책 입력화면 확인하기!

서버를 클릭하고 ctrl + alt + d를 눌러 디버깅 모드로 시작하거나 ctrl + alt + s를 눌러서 서버 모드로 시작한다

5. 데이터베이스 준비하기

01. 책 관리 데이터베이스 생성

데이터베이스 생성

CREATE database yse_spring_mvc;

데이터베이스 사용을 위한 유저 생성

CREATE user ‘yse_spring_mvc_user’@’%’IDENTIFIED BY ‘1234’;

유저에게 권한 추가

GRANT EXECUTE, SELECT, SHOW VIEW, ALTER, ALTER ROUTINE, CREATE, CREATE ROUTINE, CREATE TEMPORARY TABLES, CREATE VIEW, DELETE, DROP, event, INDEX, INSERT, REFERENCES, TRIGGER, UPDATE, LOCK TABLES ON `yse_spring_mvc`.* TO ‘yse_spring_mvc_user’@’%’ WITH GRANT OPTION; FLUSH PRIVILEGES;

02. 책 관리 테이블 생성

제목, 분류, 가격

CREATE TABLE `book`( `book_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `title` VARCHAR(200) NOT NULL, `category` VARCHAR(200) NOT NULL DEFAULT ”, `price` INT NULL, `insert_date` DATETIME NOT NULL DEFAULT NOW(), PRIMARY KEY (`book_id`) ) COLLATE=’utf8mb4_general_ci’ ;

book_id는 책의 고유 번호이며 자동 번호가 설정

title은 제목이고 최대 200글자까지 저장 가능

category는 책의 분류로 RDBMS의 정규화 규칙에 의하면 테이블을 따로 분리하는것이 맞지만 예제의 단순성을 위해 단순 문자열로 저장

price는 책 가격

inser_date는 책 정보를 입력한 날짜, 데이터가 입력되면 마리아디비의 now()함수가 실행되면서 자동으로 입력

03. 데이터베이스 라이브러리 설정

스프링에서 데이터베이스에 접속하기 위해서는 추가 라이브럴리가 필요

마이바티스라는 라이브럴리를 써서 데이터베이스에 접근하는 방식을 취할것이다

메이븐 프로젝트에서 모든 라이브러리 괸리는 메이븐이 담당, 메이븐 설정 파일인 pom.xml 파일에 아래의 내용을 추가

< project xmlns = " http://maven.apache.org/POM/4.0.0 " xmlns: xsi = " http://www.w3.org/2001/XMLSchema-instance " xsi: schemaLocation = " http://maven.apache.org/POM/4.0.0 https://maven.apache.org/maven-v4_0_0.xsd " > < modelVersion > 4.0.0 < groupId > sample.spring < artifactId > yse < name > SampleSpringYse < packaging > war < version > 1.0.0-BUILD-SNAPSHOT < properties > < java-version > 1.8 < org.springframework-version > 5.3.6 < org.aspectj-version > 1.6.10 < org.slf4j-version > 1.6.6 < dependencies > < dependency > < groupId > org.springframework < artifactId > spring-context < version > ${org.springframework-version} < exclusions > < exclusion > < groupId > commons-logging < artifactId > commons-logging < dependency > < groupId > org.springframework < artifactId > spring-webmvc < version > ${org.springframework-version} < dependency > < groupId > org.aspectj < artifactId > aspectjrt < version > ${org.aspectj-version} < dependency > < groupId > org.slf4j < artifactId > slf4j-api < version > ${org.slf4j-version} < dependency > < groupId > org.slf4j < artifactId > jcl-over-slf4j < version > ${org.slf4j-version} < scope > runtime < dependency > < groupId > org.slf4j < artifactId > slf4j-log4j12 < version > ${org.slf4j-version} < scope > runtime < dependency > < groupId > log4j < artifactId > log4j < version > 1.2.15 < exclusions > < exclusion > < groupId > javax.mail < artifactId > mail < exclusion > < groupId > javax.jms < artifactId > jms < exclusion > < groupId > com.sun.jdmk < artifactId > jmxtools < exclusion > < groupId > com.sun.jmx < artifactId > jmxri < scope > runtime < dependency > < groupId > javax.inject < artifactId > javax.inject < version > 1 < dependency > < groupId > javax.servlet < artifactId > servlet-api < version > 2.5 < scope > provided < dependency > < groupId > javax.servlet.jsp < artifactId > jsp-api < version > 2.1 < scope > provided < dependency > < groupId > javax.servlet < artifactId > jstl < version > 1.2 < dependency > < groupId > junit < artifactId > junit < version > 4.7 < scope > test < dependency > < groupId > org.mybatis < artifactId > mybatis < version > 3.5.4 < dependency > < groupId > org.mybatis < artifactId > mybatis-spring < version > 2.0.4 < dependency > < groupId > org.springframework < artifactId > spring-jdbc < version > ${org.springframework-version} < dependency > < groupId > org.apache.commons < artifactId > commons-dbcp2 < version > 2.7.0 < dependency > < groupId > org.bgee.log4jdbc-log4j2 < artifactId > log4jdbc-log4j2-jdbc4 < version > 1.16 < dependency > < groupId > mysql < artifactId > mysql-connector-java < version > 8.0.19 < build > < plugins > < plugin > < artifactId > maven-eclipse-plugin < version > 2.9 < configuration > < additionalProjectnatures > < projectnature > org.springframework.ide.eclipse.core.springnature < additionalBuildcommands > < buildcommand > org.springframework.ide.eclipse.core.springbuilder < downloadSources > true < downloadJavadocs > true < plugin > < groupId > org.apache.maven.plugins < artifactId > maven-compiler-plugin < version > 2.5.1 < configuration > < source > 1.6 < target > 1.6 < compilerArgument > -Xlint:all < showWarnings > true < showDeprecation > true < plugin > < groupId > org.codehaus.mojo < artifactId > exec-maven-plugin < version > 1.2.1 < configuration > < mainClass > org.test.int1.Main

mybatis는 XML로 쿼리를 작성하게 해주는 라이브러리다, 쿼리를 문자열로 코딩하지 않고 XML을 사용해서 관리하게 해준다

mybatis-spring은 스프링과 mybatis를 연동하게 해주는 라이브러리다

jdbc는 자바에서 데이터베이스에 접속하기 위한 API다, spring-jdbc는 스프링에서 jdbc(java database connectivity)를 통해 데이터베이스와 연결할수 있게 해준다

dbcp2는 데이터베이스 커넥션 풀(database connection pool)이다, 데이터베이스 서버와 웹 서버는 서로 다른 프로그램이고, 실무에서는 전혀 다른 컴퓨터에 설치되어 있을 가능성이 높다, 서로 다른 컴퓨터와 프로그램이 통신을 하기 위해서는 서로 연결을 맺는 과정이 필요한데, 이 시간이나 네트워크 비용이 꽤 비싼 편이다, 따라서 미리 데이터베이스와 연동하기 위한 길을 만들어놓는 라이브러리가 dbcp2이다, 최근에는 커넥션 풀로 dbcp2 대신 hikaricp를 자주 사용하기도 한다

log4jdbc-log44j2-jdbc4는 로깅을 위한 라이브러리다, 데이터베이스에 연동하는 쿼리를 콘솔이나 파일 로그로 볼 수 있게 해준다

mysql은 mysql 데이터베이스 연동라이브러이다, mariaDB도 같은 드라이버를 사용하욘다

pom.xml을 수정후에는 메이븐 빌드를 꼭 해야한다!

만역에 fail이 되면 프로젝트 클린을 해준 후 다시 빌드해준다(이클립스->project->clean)

04. 데이터 소스 설정하기

데이터베잇에 접속하기 위한 정보를 설정한다

외부 연동 관련정보는 context에서 설정

< bean id = " dataSource " class = " org.apache.commons.dbcp2.BasicDataSource " destroy-method = " close " > < property name = " driverClassName " value = " com.mysql.cj.jdbc.Driver " /> < property name = " url " value = " jdbc:mysql://localhost:3306/yse_spring_mvc?serverTimezone=UTC & useSSL=false & useUnicode=true & characterEncoding=UTF-8 " /> < property name = " username " value = " yse_spring_mvc_user " /> < property name = " password " value = " 1234 " /> < bean id = " sqlSessionFactory " class = " org.mybatis.spring.SqlSessionFactoryBean " > < property name = " dataSource " ref = " dataSource " /> < property name = " mapperLocations " value = " classpath:/sqlmap/**/*_SQL.xml " /> < bean id = " sqlSessionTemplate " class = " org.mybatis.spring.SqlSessionTemplate " > < constructor-arg index = " 0 " ref = " sqlSessionFactory " />

[Spring] 4. 웹사이트 만들기 ③ : 회원 신규 등록, 회원 정보 수정, 회원 정보 삭제

반응형

https://github.com/upcake/Class_Examples

교육 중에 작성한 예제들은 깃허브에 올려두고 있습니다.

gif 파일은 클릭해서 보는 것이 정확합니다.

– 웹사이트 만들기 ③ : 회원 신규 등록, 회원 정보 수정, 회원 정보 삭제 –

▲회원 신규 등록 작동 화면

▲회원 정보 수정 작동 화면

▲회원 정보 삭제 작동 화면

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> new JSP

신규 고객

성명
성별
이메일
전화번호

▲new.jsp

@charset “UTF-8”; @import url(‘https://fonts.googleapis.com/css2?family=Noto+Sans+KR&display=swap’); body { margin: 0 auto; text-align: center; font-size: 16px; font-family: ‘Noto Sans KR’, sans-serif; } a:link, a:visited { text-decoration: none; color: #000; } #content { padding: 20px 0; min-width: 1024px; /* 창의 최소 크기 지정 */ } img { vertical-align: middle; /* 세로축 가운데 정렬 */ } table { width: 80%; margin: 0 auto; border: 1px solid; border-collapse: collapse; /* 테두리 겹침 설정 collapse: 겹치지 않게 처리 */ } table th, table td { border: 1px solid; padding: 5px 10px; } table td a:hover { font-weight: bold; } .btnSet { margin-top: 20px; } a.btn-fill, a.btn-empty { text-align: center; padding: 3px 10px; border:1px solid #3367d6; border-radius: 3px; box-shadow: 2px 2px 3px #022d72; /* 오른쪽, 아래쪽, 번진 정도 */ } a.btn-fill { background-color: #3367d6; color: #fff; } a.btn-empty { background-color: #fff; color: #3367d6 } .btnSet a:not(:first-child) { margin-left: 3px; } a:hover { cursor:pointer; } input { height: 22px; padding: 3px 5px; font-size: 15px; } input[type=radio] { width: 18px; margin: 0 5px 3px; vertical-align: middle; } table tr td label:not(:last-child) { margin-right: 20px; } .w-pct60 { width: 60% } .w-pct70 { width: 70% } .w-pct80 { width: 80% } .w-px40 { width: 40px } .w-px60 { width: 60px } .w-px80 { width: 80px } .w-px100 { width: 100px } .w-px120 { width: 120px } .w-px140 { width: 140px } .w-px160 { width: 160px } .w-px180 { width: 180px } .w-px200 { width: 200px }

▲common.css

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="core" uri="http://java.sun.com/jsp/jstl/core" %> list JSP

고객 목록

번호 고객명 전화번호
${vo.no } ${vo.name } ${vo.phone }

▲list.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="core" uri="http://java.sun.com/jsp/jstl/core" %>

▲header.jsp

package com.hanul.iot; import java.util.List; import javax.servlet.http.HttpSession; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import customer.CustomerServiceImpl; import customer.CustomerVO; @Controller public class CustomerController { @Autowired private CustomerServiceImpl service; //컨트롤러 – 서비스 – DAO – 맵퍼 순으로 연결된다. //고객 관리 목록 화면 @RequestMapping(“/list.cu”) public String list(HttpSession session, Model model) { //서블릿에서는 request에서 getsession으로 세션을 가져왔다면, //스프링에서는 바로 세션에 접근할 수 있게 HttpSession을 지원한다. //category 어트리뷰트의 값에 따라 active 속성을 결정한다. session.setAttribute(“category”, “cu”); //카테고리 어트리뷰트에 cu를 설정 List list = service.customer_list(); model.addAttribute(“list”, list); return “customer/list”; } //고객 상세 화면 요청 @RequestMapping(“/detail.cu”) public String detail(int id, Model model) { //선택한 고객 정보를 DB에 조회해와서 CustomerVO vo = service.customer_detail(id); //화면에 출력할 수 있도록 Model에 담는다. //원래는 string타입으로 담겨야하지만 스프링에서는 자동으로 형변환이 되서 int타입으로 담긴다. model.addAttribute(“vo”, vo); return “customer/detail”; } //신규 고객 등록 화면 요청 @RequestMapping(“/new.cu”) public String customer() { return “customer/new”; } //20/07/02==================================================== //신규 고객 등록 처리 요청 @RequestMapping(“/insert.cu”) public String insert(CustomerVO vo) { //화면에서 입력한 정보를 DB에 저장한 후 service.customer_insert(vo); //목록 화면으로 연결 return “redirect:list.cu”; } //고객 정보 수정 화면 요청 @RequestMapping(“/modify.cu”) public String modify(int id, Model model) { //선택한 고객의 정보를 DB에서 조회해온 후 //수정 화면에 출력할 수 있도록 Model에 담는다 model.addAttribute(“vo”, service.customer_detail(id)); return “customer/modify”; } //고객 정보 수정 저장 처리 요청 @RequestMapping(“/update.cu”) public String update(CustomerVO vo) { //화면에서 수정 입력한 정보를 DB에 저장한 후 service.customer_update(vo); //화면으로 연결 return “redirect:detail.cu?id=” + vo.getId(); } //고객 정보 삭제 처리 요청 @RequestMapping(“/delete.cu”) public String delete(int id) { //선택한 고객 정보를 DB에서 삭제한 후 service.customer_delete(id); //목록 화면으로 연결 return “redirect:list.cu”; } }

▲CustomerController.java

package customer; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service //서비스 역할을 하는 클래스를 객체로 만들어둘때 사용 public class CustomerServiceImpl implements CustomerService { @Autowired private CustomDAO dao; @Override public void customer_insert(CustomerVO vo) { dao.customer_insert(vo); } @Override public List customer_list() { return dao.customer_list(); } @Override public CustomerVO customer_detail(int id) { return dao.customer_detail(id); } @Override public void customer_update(CustomerVO vo) { dao.customer_update(vo); } @Override public void customer_delete(int id) { dao.customer_delete(id); } }

▲CustomerServiceImpl.java

package customer; import java.util.List; import org.apache.ibatis.session.SqlSession; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; //어노테이션은 클래스를 객체로 생성하는 역할을 해줌 //@Component는 다용도, 특정역할이 있으면 역할군에 맞는 어노테이션을 사용한다. @Repository //저장소 역할을 하는 클래스를 객체로 만들때 사용 public class CustomDAO implements CustomerService { @Autowired private SqlSession sql; //SqlSession : PreparedStatement와 표현 방법이 다를뿐 같은 기능을 한다. //Autowired : 메모리에 올려둔 주소들이 자동으로 연결 됨 @Override public void customer_insert(CustomerVO vo) { sql.insert(“customer.mapper.insert”, vo); } @Override public List customer_list() { //customer.mapper라는 맵퍼에서 id가 list인 곳을 찾는다 return sql.selectList(“customer.mapper.list”); } @Override public CustomerVO customer_detail(int id) { return sql.selectOne(“customer.mapper.detail”, id); } @Override public void customer_update(CustomerVO vo) { sql.update(“customer.mapper.update”, vo); } @Override public void customer_delete(int id) { sql.delete(“customer.mapper.delete”, id); } }

▲CustomDAO.java

INSERT INTO customer(name, gender, email, phone) VALUES (#{name }, #{gender }, #{email }, #{phone }) UPDATE customer SET gender=#{gender }, email=#{email }, phone=#{phone } WHERE id=#{id } DELETE FROM customer WHERE id=#{id }

▲customer-mapper.xml

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> detail JSP

[ ${vo.name } ]고객 정보

성별 ${vo.gender }
이메일 ${vo.email }
전화번호 ${vo.phone }

▲detail.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> modify JSP

[ ${vo.name } ]고객 정보 수정

성별
이메일
전화번호

▲modify.jsp

–테이블 생성 CREATE TABLE customer ( id NUMBER CONSTRAINT customer_id_pk PRIMARY KEY, name VARCHAR2(50) NOT NULL, gender VARCHAR2(3) NOT NULL, email VARCHAR2(50), phone VARCHAR2(13) ); –시퀀스 생성 CREATE SEQUENCE seq_customer START WITH 1 INCREMENT BY 1; –레코드 삽입 INSERT INTO customer(id, name, gender) VALUES (seq_customer.NEXTVAL, ‘홍길동’, ‘남’); INSERT INTO customer(name, gender) VALUES (‘심청’, ‘여’); –트리거(trigger) 설정 CREATE OR REPLACE TRIGGER trg_customer BEFORE INSERT ON customer –커스터머 테이블에 인서트가 되기전에 FOR EACH ROW –모든 행에 대하여 BEGIN –시작한다 SELECT seq_customer.NEXTVAL INTO :new.id FROM dual; –시퀀스의 데이터를 담고있는 테이블은 없으므로 더미 테이블(dual)에서 조회한다. END; / –끝 슬래쉬까지 써줘야한다 drop trigger trg_customer; CREATE OR REPLACE TRIGGER trg_customer BEFORE INSERT ON customer FOR EACH ROW BEGIN SELECT seq_customer.NEXTVAL INTO :new.id FROM dual; END; / –조회 SELECT * FROM customer; –커밋 COMMIT; –20/07/02================================================================== –회원 관리 테이블 CREATE TABLE member( irum VARCHAR2(20) NOT NULL, id VARCHAR2(20) CONSTRAINT member_id_pk PRIMARY KEY, pw VARCHAR2(20) NOT NULL, age NUMBER, gender VARCHAR2(3) NOT NULL, birth DATE, post VARCHAR2(7), addr VARCHAR2(50), email VARCHAR2(50) NOT NULL, –유니크가 들어간다 생각하고 NOT NULL만 지정 tel VARCHAR2(20), admin VARCHAR2(1) DEFAULT ‘N’ ); –기존에 있던 member 테이블 수정 ALTER TABLE member ADD( gender VARCHAR2(3) DEFAULT ‘남’ NOT NULL, birth DATE, post VARCHAR2(7), email VARCHAR2(50), admin VARCHAR2(1) default ‘N’ ); UPDATE MEMBER SET email = id || ‘@naver.com’; ALTER TABLE member MODIFY (irum NOT NULL, pw NOT NULL, email NOT NULL); ALTER TABLE member RENAME COLUMN irum TO name; ALTER TABLE member ADD CONSTRAINT member_id_pk PRIMARY KEY(id); –관리자 회원 정보 저장 INSERT INTO member(name, id, pw, age, gender, email, admin) VALUES (‘관리자’, ‘admin’, ‘1234’, 25, ‘남’, ‘[email protected]’, ‘Y’); SELECT * FROM member;

▲table.sql

반응형

스프링 MVC- 웹 페이지 만들기

< html xmlns: th = " http://www.thymeleaf.org " > < head > < meta charset = " utf-8 " > < link th: href = " @{/css/bootstrap.min.css} " href = " /css/bootstrap.min.css " rel = " stylesheet " > < style > .container { max-width : 560px ; } < body > < div class = " container " > < div class = " py-5 text-center " > < h2 > 상품 상세 < h2 th: if = " ${param.status} " th: text = " ' 저장 완료 ' " > < div > < label for = " itemId " > 상품 ID < input type = " text " id = " itemId " name = " itemId " class = " form-control " value = " 1 " th: value = " ${item.id} " readonly > < div > < label for = " itemName " > 상품명 < input type = " text " id = " itemName " name = " itemName " class = " form-control " value = " 상품A " th: value = " ${item.itemName} " readonly > < div > < label for = " price " > 가격 < input type = " text " id = " price " name = " price " class = " form-control " value = " 10000 " th: value = " ${item.price} " readonly > < div > < label for = " quantity " > 수량 < input type = " text " id = " quantity " name = " quantity " class = " form-control " value = " 10 " th: value = " ${item.quantity} " readonly > < hr class = " my-4 " > < div class = " row " > < div class = " col " > < button class = " w-100 btn btn-primary btn-lg " onclick = " location . href = 'editForm.html' " th: onclick = " |location.href= ' @{/basic/items/{itemId}/edit(itemId=${item.id})} ' | " type = " button " > 상품 수정 < div class = " col " > < button class = " w-100 btn btn-secondary btn-lg " onclick = " location . href = 'items.html' " th: onclick = " |location.href= ' @{/basic/items} ' | " type = " button " > 목록으로

HTML

꿈꾸는 자 :: spring mvc homepage 스프링 홈페이지 만들기 1

spring mvc homepage 스프링 홈페이지 만들기 1

스프링을 이용하여 홈페이지를 제작해볼 예정입니다.

최대한 간단하게 필요한 결과 위주로 구성해볼 예정입니다.

UI는 https://adminlte.io/themes/v3/pages/layout/top-nav.html를 이용할 예정입니다.

소스코드를 다운로드 받아주세요. 용량

압축을 해제하니 용량이 제법 많으네요. 일단 다운로드한 후 잘 보관해 놓으세요.

STS를 설치해주세요. 그리고 새로운 프로젝트를 시작해요.

스프링프로젝트생성

프로젝트를 생성을 해요. 생성할때 Spring MVC Project로 해주세요.

서버를 실행해보세요. 톰캣서버로 실행을 할 거예요. 8 버전으로 맞추어 주세요.

실행을 하면 이런 화면이 보일꺼에요.

hello world

??? 표도 나오고 그러죠? 이제 utf8환경으로 세팅을 할 건데요. 세팅되어 있는 환경을 복사하는 형태로 진행할게요.

안에 내용은 따로 공부해보세요. 검색하면 잘 나와요.

처음에 할 일은 pom.xml을 수정할 거예요.

pom.xml

이 부분을 남기고 모두 첨부한 pom.xml과 같게 수정을 해줘요 안에 필요 없는 내용은 삭제하시면 돼요.

pom.xml 0.01MB

다음은 web.xml을 수정할게요.

web.xml 0.00MB

web.xml내용을 복사해주세요.

이제 jsp페이지를 수정할 거예요.

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ page session="false" %> Home

Hello world!

The time on the server is ${serverTime}.

내용일 텐데요 아래와 같이 수정을 해요.

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> Home

Hello world!

The time on the server is ${serverTime}.

서버 폴더 안에 톰캣 8이 있어요 거기에 server.xml이 있는데 이걸 수정할 거예요.

path를 지우세요. 이러면 localhost:8080으로 접속 시 바로 home.jsp내용이 나와요.

헬로우 월드가 출력되었죠?

다음은 ADMINLTE3 네이게이션페이지를 출력해볼께요.

참고자료

https://book.naver.com/bookdb/book_detail.nhn?bid=9425458

참고카페

https://cafe.naver.com/gugucoding

spring boot 로 웹사이트 만들기

반응형

웹서비스를 하나 만들려고 한다. 오픈소스, 무료 서비스만 이용하고 서버운영시 과금없는 서비스를 우선 목표로 했다.

학원 운영자가 사용할 회원관리/일정관리/수납관리 기능을 가진 웹사이트 java 가 그나마 익숙해서, spring boot 로 웹서비스 개발. bootstrap 사용하여 최소한의 디자인만 할 예정. 반응형 웹사이트로 개발. mongo altas 이용하여 DB구성 Heroku 클라우드 서비스를 이용하여 app 배포 및 웹사이트 관리 github priavte 레파지토리로 형상관리. 브랜치 전략으로 staging 서버도 구축.

spring boot – the world’s most popular Java framework.

spring boot 로 웹서비스 기반을 우선 만들어보기로 했다. java 를 배우게 되면 spring framework 을 같이 공부할 수 밖에 없다. 웹 서비스 관련 개발이다 하면 spring framework 기반이 아닌 프로젝트를 찾기가 어렵기 때문에, 자연스레 알게 되거나 더 깊게 공부하게 마련이다. 아래 사이트를 기반으로 시작했다.

https://start.spring.io 에 가면, Spring Initializr 사이트가 나오는데, 여기서 몇 번의 선택만으로도 초기 spring 프로젝트를 셋팅할 수 있다. maven project / spring boot 2.6.6 / packging JAR / java 11 을 선택했다. 그리고 중요한 dependencies 는 Thymeleaf / Spring Web / Spring Boot DevTools / Spring Data MongoDB 를 추가했다. 입력이 끝나면 하단에 버튼이 3개 있는데, Generate 버튼을 눌러서 다운 받는다.

bootstrap – the world’s most popular front-end open source toolkit

프로젝트는 간단하게 만들긴 했지만, 계속 따라해봤자 너무 허접한 사이트 디자인만 나오게 되다보니 의욕이 나질 않는다. 웹사이트는 기본적으로 디자인이 생명이라고 생각하기 때문에, 그것을 보완할 오픈소스가 필요했다. 우선 여러 후보가 있긴 했지만, 부트스트랩이 그나마 예제도 많고 반응형 웹을 만들기에 적합해보였다. 필요한 기능을 이것저것 찾다보니, 여기에 있는 대부분의 예제와 매뉴얼을 거의 다 본거 같다. 예제를 일괄로 다운가능한데 거기서 필요한 것만 이것저것 골라서 만들 수 있다.

mongodb

DB 를 어떤 것을 선택할 것인가에 대한 고민이 가장 어려웠던거 같다. 최대한 오픈소스를 기준으로 고르다보니, postgreSQL, mongoDB 두개 중에 고민을 마지막까지 하다가, mongodb 에서는 altas cloud 서비스를 무료로 512MB 를 제공하고 있어서 최종 선택했다. 사실 이제껏 내가 다룬 RDMBS 와 다른, document 형식의 DB 다보니 시행착오가 정말 많았다. 괜히 이렇게 구현했나 싶을 정도였는데, 그마저도 익숙해지니 하나씩 기능 찾는 재미가 있긴했다. 내 경우 대용량 데이터 베이스는 아니어서 충분한 기능을 쓸일이 아직은 없는데, 이렇게 웹서비스로도 사용해보니 부족함이 느껴지진 않았다.

반응형

Fullcalendar – The Most Popular JavaScript Calendar

웹에서 달력형태에 스케줄을 입력해야 하는 기능이 필요했다. 여러가지 오픈소스를 확인하다가 fullcalendar 를 찾았고, 내가 필요로 하는 대부분의 기능을 지원하고 있고, 무료라서 조금만 공부하면 금방 사용할 수 있다.

Datatables – To enhance the accessibility of data in HTML tables.

웹서비스를 만들다보면 가장 많이 쓰게 되는 뷰가 그리드 형태, 즉 표형태의 정보를 보여주는 건데 리스트가 길면 페이징 처리가 들어가고, 항목별로 검색, 정렬 등이 되어야 한다. 이런 것들을 일일이 개발할 수 없기 때문에 잘 정리된 오픈소스를 이용하게 되는데, Datatables 이 나에게는 적합했다.

flatpickr – lightweight and powerful datetime picker.

웹으로 날짜/시간 등을 입력받을 때, 텍스트로 일일이 입력받는게 아니라, 달력을 이용하거나 시간 선택 컴포넌트를 이용해서 입력편의성을 높이게 된다. 처음에는 그냥 텍스트로 입력받도록 내비두었었는데, 오타도 있고 편의성이 떨어지다보니 구글링해서 오픈소스를 하나 선택하게 되었다.

chartjs – Open source HTML5 Charts for your website.

마지막으로 chart 를 위한 라이브러리가 필요했다. 복잡하진 않아도 이쁘고, 심플한 표현이 가능한 JS라이브러리를 찾았고, chartjs 로 선택해서 개발했다.

위에서 설명한 오픈소스 라이브러리들로 만든 사이트가 아래 웹서비스이다. 조금씩 짬내서 하는 수준치고는 만족할만한 결과물이 나온거 같다. 로그인을 해야 하는데 id : user / pw : password 로 입력하면 된다.

반응형

SPRING BOOT를 이용한 나의 첫 웹페이지 제작 (1)

웹페이지의 개발은 크게 2가지로 나뉜다고 한다.

하나는 프론트앤드 개발이고

다른 하나는 백앤드 개발이다.

프론트앤드 개발은 웹페이지 사용자가 직접 눈으로 보게되는 사이트의 디자인, 즉 VIEW를 만드는 것이라고 한다.

VIEW는 보통 HTML(내용)+CSS(이미지,디자인), JAVASCRIPT(웹을 동적으로,풍부하게)를 통해서 만들어지게 된다.

백엔드 개발은 사용자에게 보이는 부분이 아니라, 웹페이지의 내부적인 것을 다루게 된다.

백엔드 개발에서 가장 중요시 되는 것은 웹을 데이터베이스와 연동하여 사용할 수 있게끔 만들어주는 것이다.

이 카테고리에서 지금부터 다루게 될 스프링 부트 프레임워크는 JAVA언어를 사용하는 백엔드-프레임워크 이다.

간단하게 내 노트북 안에 작은 SQL(데이터베이스)저장소를 만들고 그 저장소를 참고하는 게시판 사이트를

LOCALHOST에 띄워보는 작업을 진행 할 것이다.

이클립스 설치부터 JDK, 환경변수 설정 등등 아주 기초적인 곳 부터 시작하는 웹 페이지 제작을 같이 시작해보자.

스프링부트+jsp로 배달사이트 만들기-01 프로젝트 생성

스프링부트+ jsp + mybatis로 배달 사이트 만드는 과정입니다

sts4, 오라클, maven을 사용합니다

혼자서 프로젝트를 만드는 과정을 올린 것이니 잘못된 점이나 고쳐야 할 점이 있을 경우 지적해주시면 감사하겠습니다

File -> new -> spring starter project

위와같이 설정후 next

기본적으로 3가지 체크후 finish를 클릭합니다

처음 프로젝트를 만들땐 1~2분정도 소요됩니다

com.baemin 패키지 아래에 controller 패키지 생성후 MainController 클래스를 생성합니다

@RestController public class MainController { @GetMapping(“/”) public String test() { return “test”; } }

테스트로 실행해볼 메서드를 작성후

boot Dashboard에서 실행할 프로젝트 클릭 후 start버튼을 클릭합니다

크롬 브라우저를 열고 http://localhost:8080/ 입력합니다

스프링으로 홈페이지 만들기 #2 (프로젝트 생성 및 설정)

https://tuta.tistory.com/2

#1에서 이어서 하는 글이다.

하란대로 설정하다가 도중에 이상한 것이 있었다.

그것은 바로 servers 폴더가 없는 것이였다..

다른 글들을 참조해보니, servers 폴더는 프로젝트 생성시에 기본적으로 있는 거 같다….

servers 폴더 만드는 방법을 찾다가 다음과 같은 글을 찾았다.

https://codedragon.tistory.com/3848

이걸 보고 따라했더니 servers 폴더가 생성되었다.

그리고 이 글이랑 몇몇 글을 더 보니 STS가 이클립스랑 완전 다른 프로그램이 아니라,,,

이클립스의 파생으로, Spring MVC 프로젝트를 개발하기 위한 여러가지 플러그인?들이 깔려져 있다고 한다.

이클립스에서도 Spring 개발을 할 수 있지만 깔아야 할 것들이 많고 설정하기 불편해서 STS를 사용한다고 한다.

servers 폴더가 생성된 상태. 위의 사진은 Navigator 탭을 켜놓은 상태이다.

그리고 home.jsp를 실행하려고 home.jsp에서 Run as -> Run on Server를 실행하였다.

실행이 안되길래 띠용 했는데 구글링을 통해 알아본 결과…

WEB-INF에서 직접적으로 접근하는 것은 막혀있다고 한다………..

그니까 home.jsp를 WEB-INF 폴더 주소를 통해 접근하면 안된다고 한다..

지금 생각해보니깐 예전 학교 동아리에서도 알았던 것 같은데 오랫만에 하니깐 까먹었었다.

그리고 내가 따라하는 블로그 글을 다시 보니깐 home.jsp에서 실행하는게 아니라 프로젝트를 누르고 실행을 하라고 한다…

다음과 같이 실행을 하니..

정상적으로 실행이 되었다.

[Inflearn] 스프링 MVC (8) 웹 페이지 만들기

김영한 강사님의 ‘스프링 MVC 1편 – 백엔드 웹 개발 핵심 기술’ 강의 정리

2022.02.21,03.7 진행

강의를 듣고 개인적으로 정리한 글입니다. 코드와 그림 출처는 김영한 강사님께 있습니다. 문제 있을 시 알려주세요.

드디어 이번 강의 마지막 파트! 졸업과 밴드 합주, 정보처리기사 필기시험 준비 등이 겹쳐 바쁜지라 그간 강의를 거의 듣지 않았다… 필기합격한거 같으니 다시 빠샤~! 다음 강의도 쭉쭉 들어야지 😋

상품 도메인

package hello.itemservice.domain.item; import lombok.Data; import lombok.Getter; import lombok.Setter; //@Data //다만들어줘서 위험하다..(숙지 필요)일반 왔다갔다하는 DTO 정도는 괜찮 @Getter @Setter public class Item { private Long id; private String itemName; private Integer price; private Integer quantity; public Item() { } public Item(String itemName, Integer price, Integer quantity) { this.itemName = itemName; this.price = price; this.quantity = quantity; } }

package hello.itemservice.domain.item; import org.springframework.stereotype.Repository; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @Repository public class ItemRepository { //동시에 여러스레드에서 접근 시 HashMap,long 사용x private static final Map store = new HashMap<>(); //static private static long sequence = 0L; //static public Item save(Item item){ item.setId(++sequence); store.put(item.getId(),item); return item; } public Item findById(Long id){ return store.get(id); } public List findAll(){ return new ArrayList<>(store.values()); //한번 감싸서 반환하면 안전하다(현재 변수에 변경이 x) } public void update(long itemId, Item updateParam){ //프로젝트가 커지면 ItemParamDTO 클래스(id빼고 있음)를 따로 만들어 사용하는게 명확하다 Item findItem = findById(itemId); findItem.setItemName(updateParam.getItemName()); findItem.setPrice(updateParam.getPrice()); findItem.setQuantity(updateParam.getQuantity()); } public void clearStore(){ store.clear(); } }

부트스트랩 적용

부트스트랩은 웹사이트를 쉽게 만들 수 있게 다양한 기능을 제공하는 HTML, CSS, JS 프레임워크이다. 하나의 CSS로 다양한 기기에서 작동한다.

부트스트랩 다운 https://getbootstrap.com/docs/5.0/getting-started/download/

압축 풀고 bootstrap.min.css 를 복사해서 resources/static/css 폴더에 추가

이렇게 잘 나오면 성공인데, 인텔리제이 문제로 종종 안뜰 수 있다. 그러면 빌드파일이 저장되는 out 폴더에 복사해놓은 파일이 안보일 경우 out 폴더를 지워주고 서버를 다시 켠다.

정적 리소스가 공개되는 /resources/static 폴더에 HTML을 넣어두면 실제 서비스에서도 공개되므로 주의할 것

타임리프 사용 – 상품 목록,상세,등록 폼

상품 목록, 상세, 등록등의 폼은 강의에서 제공되는 html을 사용하였다.

URI 설계는 다음과 같다.

상품목록 GET /baisc/items 상품버튼 → 상품상세

상품상세 GET /baisc/items/{itemId}

상품등록폼 GET /baisc/items/add 저장버튼→ 상품저장

상품저장 POST /baisc/items/add → 상품상세(내부호출)

HTML Form 전송은 PUT, PATCH를 지원하지 않으므로 GET, POST만 사용할 수 있다.

페이지가 동적으로 돌아가게 하기위해 html을 타임리프로 고칠 것이다. 태그에 다음 코드를 넣는다.

부트스트랩의 css 파일을 불러오는 방식을 [상대경로]에서 [절대경로]로 바꿔주자.(나중에 폴더 바뀌어도 되도록)

타임리프는 th:를 붙이면 기존코드를 덮는 식으로 동작한다. 링크거는건 @ 붙이면 됨.

위 코드들은 include 문법으로 공통처리 할 수 있다.

타임리프는 뷰 템플릿이 렌더링 될 때만 치환을 해준다. 그래서 순수 html 파일을 웹브라우저에서 열어도 그대로 쓸 수 있고 깨지지 않는다는 게 장점이다. (서버를 띄웠다 내렸다 하지 않고 테스트를 할 수 있다) 그래서 내추럴 템플릿이라고도 한다.

계속해서 html파일을 templates 폴더에 옮긴 다음, 위와 같이 불러오는 데이터나 버튼의 링크 부분을 타임리프로 바꿔서 적용시킨다. Controller의 함수와 매칭해서 작성한다.

하나의 URL로 꿩먹고 알먹고

HTTP 강의에서 배운 API방식대로, 같은 URL이지만 다른 HTTP 메서드를 사용해서 깔끔하게 처리한다!

GET /basic/items/add → addForm.html → POST /basic/items/add

상품 등록 폼: GET, /basic/items/add

상품 등록 처리: POST, /basic/items/add

상품 등록 폼

상품 입력

th:action 이렇게 값을 비워도 자신의 URL에 POST 방식으로 보내므로 똑같이 동작한다.

ModelAttribute로 상품 등록 처리

@ModelAttribute 는 요청파라미터를 처리하고 Model을 추가해주는 역할을 한다.

모델 객체(Item)를 생성하고 요청 파라미터의 값을 프로퍼티 접근법(setXX)으로 저장해준다.

@ModelAttribute(“item”) Item item →이렇게 괄호에 지정한 객체를 자동으로 모델에 넣어준다. 이름을 생략하면 클래스명의 첫글자만 소문자로 변경해서 모델로 등록한다.

→이렇게 괄호에 지정한 객체를 자동으로 모델에 넣어준다. @ModelAttribute 자체도 생략가능하지만 권장하지 않는다고 하심. 이 경우 대상 객체가 모델에 자동등록된다.

자체도 생략가능하지만 권장하지 않는다고 하심.

@PostMapping(“/add”) public String addItemV3(@ModelAttribute Item item){ itemRepository.save(item); // model.addAttribute(“item”,item); //자동 추가, 생략 가능 return “basic/item”; }

Redirect – 상품수정

상품 수정도 똑같이 /basic/items/edit 이 URL 하나로 GEt과 POST 메서드 두개를 쓰자.

상품 수정버튼을 눌렀을 때 /basic/items/{itemId}/edit 로 이동하고, 저장버튼을 누르면 /basic/items/{itemId}로 리다이렉트 한다.

스프링은 redirect:/… 으로 리다이렉트를 지원한다.

@GetMapping(“/{itemId}/edit”) public String editForm(@PathVariable Long itemId, Model model){ Item item = itemRepository.findById(itemId); model.addAttribute(“item”,item); return “basic/editForm”; } @PostMapping(“/{itemId}/edit”) public String edit(@PathVariable Long itemId, @ModelAttribute Item item){ itemRepository.update(itemId,item); return “redirect:/basic/items/{itemId}”; }

강의에서는 입력 폼도 이쁘게 나오던데 난 왜 이모양일까… 🤷‍♀️

itemA의 상품명을 itemD로 변경하고 저장하면, HTTP 302코드가 나오며 Location헤더에 있는 url로 리다이렉트 한다.

PRG Post/Redirect/Get

사실 지금까지 작성한 컨트롤러는 심각한 문제가 있다…?! 🙄

@PostMapping(“/add”) public String addItemV4(Item item){ itemRepository.save(item); return “basic/item”; }

상품저장 POST /baisc/items/add → 상품상세(내부호출)

상품 등록을 위해 /basic/items/add 로 요청이 들어오면, 위의 GET addForm 메서드가 실행되어 basic/addForm.html 이 내보내지고, 저장버튼을 누르면 위의 POST addItemV4 메서드가 실행되어 상품을 저장한 후 baisc/item.html를 내부 호출했다.

문제는 새로고침을 할 경우 마지막에 전송한 POST /basic/items/add + 상품 데이터를 서버로 다시 전송하게 된다는 것이다. 따라서 등록한 상품이 계속 추가되는 문제가 발생한다…!!

이를 해결하기 위해서는 상품 저장 후에 뷰 템플릿으로 이동하지 않고, 리다이렉트를 호출하면 된다.

그러면 새로고침을 해도 마지막 호출인 GET/items/{itemId}가 되어 문제가 없어진다.

RedirectAttributes

// @PostMapping(“/add”) public String addItemV5(Item item){ itemRepository.save(item); return “redirect:/basic/items/” + item.getId(); } @PostMapping(“/add”) public String addItemV6(Item item, RedirectAttributes redirectAttributes){ Item savedItem = itemRepository.save(item); redirectAttributes.addAttribute(“itemId”,savedItem.getId()); redirectAttributes.addAttribute(“status”,true); return “redirect:/basic/items/{itemId}”; }

addItemV5 메서드와 같이 +item.getId() 같이 URL에 변수를 더해서 사용하면 URL 인코딩이 안되므로 위험하다(URL에 띄어쓰기나 한글이 들어가면 안된다). 따라서 RedirectAttributes를 사용하자.

또한 사용자가 저장을 했을 때 식별할 수 있도록 저장완료라는 글자도 띄워보자.

/baisc/item.html에 아래 코드를 추가한다.

키워드에 대한 정보 스프링 웹 사이트 만들기

다음은 Bing에서 스프링 웹 사이트 만들기 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 Spring MVC (스프링 웹 MVC) 강의 03 – 메이븐을 이용한 기본 웹 프로젝트 생성하기

  • 동영상
  • 공유
  • 카메라폰
  • 동영상폰
  • 무료
  • 올리기

Spring #MVC #(스프링 #웹 #MVC) #강의 #03 #- #메이븐을 #이용한 #기본 #웹 #프로젝트 #생성하기


YouTube에서 스프링 웹 사이트 만들기 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 Spring MVC (스프링 웹 MVC) 강의 03 – 메이븐을 이용한 기본 웹 프로젝트 생성하기 | 스프링 웹 사이트 만들기, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

Leave a Comment