728x90
728x90

Spring/Maven Project 31

Spring에 게시물 업데이트, 삭제 처리 - Update, Delete

이번에는 CRUD의 U(Update)와 D(Delete)로 게시물을 수정하고 삭제하는 UI와 UPDATE / DELETE Query, DAO, Service, Controller를 추가하도록 하겠습니다. Maven Spring Project의 Board Mapper XML에 Update, Delete Query 추가하기 1. com.home.study.test1.sqlmapl.mappers.mariadb.board 패키지에 있는 BoardMapper.xml 파일을 오픈합니다. 2. INT_BOARD_TB(게시판) Table에 데이터(게시물)를 수정(update) 하기 위해서 으로 쿼리문을 생성하고 데이터(게시물)를 삭제(delete) 하기 위해서 으로 쿼리문을 생성합니다. 와 의 id 속성은 update..

Spring에 게시물 뷰 처리 - View

이번에는 CRUD의 R(Read)로 게시물을 보는 UI를 생성하고 SELECT Query, DAO, Service, Controller를 추가하도록 하겠습니다. Maven Spring Project의 main.jsp에 보기 기능 추가하기 1. /src/main/webapp/WEB-INF/views/main/main.jsp 파일을 오픈하여 태그에 class와 data-sequence를 추가합니다. data-sequence의 값으로 게시물(boardItem)의 sequence를 설정합니다. 검색된 게시물이 없습니다. ${boardSearch.pagination.recordTotalCount - ((boardSearch.pagination.pageNo - 1) * boardSearch.pagination.re..

Spring에 Hibernate(하이버네이트)의 BindingResult를 spring-form JSP Tag Library인 <form:errors> 또는 <spring:hasBindErrors>로 처리

Hibernate Validator로 유효성 검사한 결과(BindingResult 객체)를 Form Tag Library에 있는 태그를 사용하여 웹 페이지에서 처리하는 방법에 대해 알아보겠습니다. form에 대한 유효성 검사 결과 메시지를 태그로 렌더링 합니다. path : Model(모델)과 연동하여 유효성 검사 결과를 바인딩할 속성 경로 (path가 *이면 전체 유효성 검사 결과 메시지가 노출됩니다. 메시지들은 로 구분됩니다.) 렌더링 결과 form의 modelAttribute가 board이면 board.errors로 id가 설정됩니다. 유효성 검사 결과 메시지는 태그 안에 추가됩니다. path에 Model(모델)의 속성 경로를 설정하면 Model(모델)의 속성에 대한 유효성 검사 결과 메시지가 노출..

Spring에 Hibernate(하이버네이트) Validator 적용 - @NotNull, @NotEmpty, @Size, @Valid, BindingResult

서버에서 유효성 검사를 Controller에서 하지 않고 객체(Bean)에서 유효성 검사를 할 수 있는 빈 유효성 검사(Bean Validation) 구현체에 대해 알아보고 적용하겠습니다. 빈 유효성 검사(Bean Validation)는 객체(Bean)를 검증하기 위한 메타데이터(metadata) 모델과 API를 정의한 명세서(Specification)로 Annotation(어노테이션)을 사용하여 메타데이터를 정의하고 유효성을 검증하는 프로세스에 대해 정의되어 있습니다. 그리고 XML Validation Descriptor를 사용하여 메타데이터를 재정의하고 확장할 수 있게 되어 있습니다. 이 명세서는 2019년 8월 5일에 Jakarta Bean Validation 2.0 (https://beanvali..

Spring에 Server-Side Validation 처리

웹 서버에서 전송(Submit)된 게시물 내용(폼(form) 데이터)을 처리하거나 데이터베이스에 등록하기 전에 폼(form) 데이터의 값이 유효한지(데이터 타입이나 길이, 범위, 패턴이 맞는지) 검사하는 것을 Server-Side Validation이라고 합니다. 개발된 것을 보면 대부분 클라이언트(웹 브러우저)에서만 유효성 검사를 하는 경우가 많습니다. 그 이유는 사용자가 입력한 데이터에 대한 피드백을 바로 전달할 수 있기 때문입니다. 그렇지만 사용자가 클라이언트(웹 브러우저)의 스크립트를 조작하여 유효성 검사를 하지 않고 서버에 전송하게 되면 유효하지 않는 데이터가 데이터베이스에 저장될 수 있습니다. 그렇기 때문에 서버에서 다시 유효성 검사를 하는 것이 좋습니다. (대부분의 사용자는 웹 브라우저의 스..

Spring에 JavaScript Validation API 적용 - form checkValidity, CSS :valid vs :invalid

매번 script에서 form(폼) 안에 있는 모든 입력 요소(required 속성이 있는 입력 요소)에 대해 checkValidity() 메서드를 호출하고 validity 유형에 따라 메시지를 작성하여 노출시켜야 하는 번거로움이 있습니다. 그래서 한 번에 호출하고 한 번에 유효성 메시지를 노출시키는 방법에 대해 알아보겠습니다. checkValidity() 메서드는 입력 요소뿐만 아니라 form(폼)에서도 사용할 수 있습니다. 그래서 form(폼)에서 checkValidity() 메서드를 호출하면 form(폼) 안에 있는 모든 입력 요소(required 속성이 있는 입력 요소)에 대해 유효성 검사를 진행하게 됩니다. required 속성이 있는 입력 요소 전체가 유효하지 않으면 false를 리턴합니다. ..

Spring에 JavaScript Validation API 적용 - checkValidity, validity(tooLong, tooShort, rangeUnderflow, rangeOverflow, badInput, stepMismatch, patternMismatch, typeMismatch), validationMessage, setCustomValidity

게시물을 등록하기 전(폼(form)을 전송(Submit) 하기 전)에 입력한 데이터가 정확한지 Validation(밸리데이션)하여 입력값이 정확하지 않으면 사용자에게 알려주어 다시 입력하게 하는 것을 Client-Side Validation이라고 합니다. 이전에서 처리한 등록 버튼 script처럼 단순하게 입력란에 입력한 데이터가 있는지만 판단하는 정도라면 JavaScript Validation API를 사용하여 처리할 수 있습니다. JavaScript Validation API는 입력한 데이터의 유무뿐만 아니라 입력한 데이터의 길이가 긴지 짧은지, 패턴과 일치하는지, 숫자가 아닌 문자가 있는지, 숫자가 큰지 작은지 검사할 수 있습니다. JavaScript Validation API는 DOM 지원하는 모..

Spring에 게시물 등록 처리 - Create, Client-Side Validation

지금부터는 게시판에 게시물을 등록, 조회, 수정, 삭제할 수 있게 개발하도록 하겠습니다. 일반적으로 개발에서는 게시물을 등록, 조회, 수정, 삭제하는 것을 CRUD라고 합니다. CRUD는 Create(생성/등록/추가), Read(읽기/조회), Update(변경/수정), Delete(삭제/제거)의 첫 문자를 따서 만든 용어입니다. 또는 Add(추가), Browse(보기), Change(변경), Delete(삭제)의 첫 문자를 따서 ABCD라고도 합니다. 이번에는 CRUD의 C(Create)로 게시물을 등록하는 UI와 INSERT Query, DAO, Service, Controller를 생성하도록 하겠습니다. Maven Spring Project의 main.jsp에 등록 버튼 추가하기 1. /src/mai..

Spring에 Pagination(페이지네이션) 처리 및 적용 3

페이지네이션에서 전체 페이지 앞 번호 버튼, 이전 페이지 사이즈 번호 버튼, 다음 페이지 사이즈 번호 버튼, 전체 페이지 마지막 번호 버튼을 활성화 또는 비활성화로 제어하면 클릭에 대한 오류를 방지할 수 있습니다. (이미 내부 소스에서 예외처리가 되어 있어 오류는 발생하지 않습니다.) 페이지네이션에서 버튼은 태그가 아닌 태그와 태그를 사용하고 있습니다. 태그는 비활성화하기 위해서 disable 속성을 추가하면 되지만 태그와 태그는 disable 속성이 지원되지 않습니다. 참고로 태그를 비활성화하기 위해서는 일반적으로 href 속성을 제거합니다. First First 그러나 태그를 화성화/비활성화하기 위해서는 Script에서 동적으로 href 속성을 제거했다가 추가해야 하는 문제점이 있습니다. 현재 페이지..

Spring에 Pagination(페이지네이션) 처리 및 적용 2

검색된 게시물이 많아지면 페이지네이션에서 노출되는 페이지 번호가 많아집니다. 그래서 노출되는 페이지 번호의 수를 조절하지 않으면 페이지네이션 UI에 문제점가 발생합니다. 예를 들어, 검색된 결과가 350건이고 페이지 크기가 5이면 페이지네이션에 노출되는 페이지 번호가 70개가 됩니다. 이렇게 사용하는 게 문제가 없으면 상관은 없습니다. 그러나 페이지네이션에서 노출되는 페이지 번호 수가 많으면 복잡해 보일 수 도 있습니다. 그래서 페이지네이션에서 노출되는 페이지 번호 수를 조절하여 처리되도록 페이지네이션 클래스를 생성하도록 하겠습니다. 페이지네이션에서 노출될 페이지 번호 개수를 페이지 사이즈(pageSize)라고 하고 노출될 페이지 사이즈의 시작 번호를 페이지 시작 번호(pageStartNo), 노출될 페..

Spring에 Pagination(페이지네이션) 처리 및 적용 1

이전 Paging(페이징) 처리로 Page(페이지) 단위로 게시판에서 게시물 리스트를 가져올 수 있게 되었습니다. 이번에는 나누어진 Page(페이지)를 번호로 표시하여 노출시키고 페이지 번호를 클릭하면 해당 페이지에 해당하는 게시물 리스트를 가져오게 처리하겠습니다. Maven Spring Project의 main.jsp에 Pagination UI 추가하기 1. /src/main/webapp/WEB-INF/views/main/main.jsp 파일을 오픈합니다. 2. form에 현재 페이지 번호를 전달하기 위해 현재 페이지 번호(pageNo)를 hidden 태그로 추가합니다. 태그 안에 태그를 생성하고 path 속성에 boardSearch 객체에서 paging 객체의 pageNo 변수를 지정합니다. 3. 태..

Spring에 Paging(페이징) 처리 및 적용

게시판에서 게시물 리스트를 가져올 때 가져올 게시물 리스트 수를 지정하여 가져오지 않으면 전체 게시물(수십 건부터 수백만 건)을 리스트를 가져오게 됩니다. 그러면 Query(쿼리) 처리로 인해 Database(데이터베이스)에 부하가 발생하고 많은 처리 결과를 리턴하게 되어 네트워크의 트래픽이 증가되는 문제가 발생하게 됩니다. 그래서 게시판에서 게시물 리스트를 가져올 때 게시물 리스트 수를 정해서 나누어서 가져오는 게 좋습니다. 이처럼 일정한 크기로 Database(데이터베이스)의 Table(테이블)에서 Row(레코드)를 나누는 것을 Paging(페이징)이라고 하고 일정한 크기를 가진 Row(레코드)를 Page(페이지)라고 합니다. 그리고 나누어진 Page(페이지)를 이전 페이지나 다음 페이지 또는 특정 ..

Spring에 spring-form JSP Tag Library 사용 - <form:form> <form:hidden> <form:select> <form:option> <form:input>

Spring(스프링)에서는 JSP(Java Server Pages)에서 사용할 수 있는 Form Tag Library를 제공하고 있습니다. 이 Form Tag Library를 사용하면 쉽고 편리하게 자동으로 Form에 데이터를 바인딩할 수 있습니다. Spring Framework JSP Form Tag Library Form Tag Library는 태그를 렌더링 하고 Model(모델)과 연동하여 태그의 내부 태그에 데이터를 바인딩을 해줍니다. (내부 태그는 path를 사용하여 Model(모델)의 데이터에 접근합니다.) Form Tag Library는 라이브러리이기 때문에 JSP에서 사용하기 위해서 taglib(태그 라이브러리) 지시문을 추가해야 합니다. prefix는 접두사로 원하는 문자열로 변경해도 됩..

Spring에 Data Binding(바인딩) - @ModelAttribute, Form 데이터 유지

Spring(스프링)의 Controller에서는 전달되는 데이터를 Method(메서드)에 있는 Bean(빈)으로 Binding(바인딩)을 해주고 Bean(빈)을 Model(모델)의 속성으로 추가해 주는 @ModelAttribute Annotation(어노테이션)에 대해 알아보고 Model(모델)에 추가된 속성을 사용하여 태그에서 전달된 값을 유지되도록 하겠습니다. @ModelAttribute Annotation 이전에 알아본 Auto Binding 처럼 웹 브라우저(Web Browser)로 부터 전달되는 데이터를 분석하여 자동으로 Method(메서드)에 있는 Bean(빈)으로 Binding(바인딩)을 해주고 Bean(빈)을 Model(모델)의 속성으로 추가해 줍니다. 즉, Controller에서 Meth..

Spring에 Data Binding(바인딩) - @RequestParam, Auto Binding

Spring(스프링)의 Controller에서 웹 브라우저(Web Browser)로 부터 전달되는 데이터를 Binding(바인딩)하여 사용하는 방법에 대해 알아보겠습니다. Spring(스프링)의 Controller에서는 전달되는 데이터를 Method(메서드)의 파라미터로 바인딩(Binding)해주거나 Method(메서드)에 있는 Bean(빈)으로 Binding(바인딩)을 해줍니다. @RequestParam Annotation Spring(스프링)의 Controller에서는 GET 방식으로 웹 브라우저(Web Browser)로 부터 전달되는 데이터를 Method(메서드)에 있는 파라미터에 Binding(바인딩)을 해줍니다. 즉, Controller에서는 HttpServletRequest 객체를 사용하여 M..

Spring에 Data 전달 - GET, POST, HttpServletRequest getParameter

웹 브라우저(Web Browser)에서 웹 서버로 데이터를 전송하는 방식은 GET 방식과 POST 방식이 있습니다. GET vs POST GET 방식은 URL 뒤에 파라미터(KEY=VALUE)를 붙여 넘깁니다. 파라미터는 KEY=VALUE(키=값)로 구성하고 &로 여러 개의 파라미터들을 구분합니다. 파라미터는 URL 뒤에 ?를 추가하여 붙입니다. 파라미터를 QueryString(쿼리스트링)이라고 합니다. /index.do?searchType=subject&searchCondition=like&searchKeyword=테스트+제목+1 또는 /index.do?searchType=subject&searchCondition=like&searchKeyword=테스트%20제목%201 검색할 키워드의 문자열에 공백이..

Spring에 Service - Interface, Implement 추가

Controller에서 DAO를 직접 사용하지 않고 Service를 통해서 처리되도록 하겠습니다. 그럼 Service에 대해 알아보겠습니다. Service Spring(스프링)에서 Service의 역할은 전달받은 데이터들을 연산하거나 로직에 따라 처리하고 DAO를 사용하여 데이터를 처리합니다. 즉 Service는 비즈니스 로직을 처리하는 부분으로 생각하시면 됩니다. 또한, Service에서는 다른 비즈니스 로직을 처리하는 Service나 Component를 사용하여 처리할 수 있습니다. Service에서는 비즈니스 로직과 DAO를 사용하여 처리하기 때문에 Controller에서 DAO를 직접 사용하지 않고 Service를 사용하여 처리하면 됩니다. 추가로, Service Implements(구현체) 클래..

Spring에 Mapper XML - Search 공통 처리, DAO - 카운트 기능 추가

Mapper XML에서 검색 조건 Model(모델)를 사용하여 에서 를 추가하여 처리하였습니다. 그런데 동일한 검색 조건 Model(모델)이 다른 에서도 사용된다면 어떻게 해야 할까요? 그냥 에 를 동일하게 추가해도 됩니다. 그런데 검색 조건이 추가되거나 수정된다면 모든 에서 를 수정해야 하는 번거로움이 있습니다. 그래서 Mapper XML에서는 동일하게 사용되는 쿼리문을 분리하여 재사용할 수 있게 를 지원하고 있습니다. 에서 동일하게 사용될 를 로 분리하여 재사용되도록 수정하겠습니다. Maven Spring Project에 Board Mapper XML 수정하기 1. com.home.study.test1.sqlmapl.mappers.mariadb.board 패키지에 있는 BoardMapper.xml 파..

Spring에 DAO - Search Model 추가, Mapper XML - WHERE 적용

이전에 DAO(Data Access Object - 데이터 접근 객체, 다오) Interface(인터페이스)와 Implements(구현체)를 만들어 study Database에 있는 INT_BOARD_TB(게시판) Table에서 전체 데이터(게시물)를 조회(select)하여 데이터를 가져왔습니다. 이어서 검색 조건에 맞는 데이터만 가져오도록 검색 기능을 추가하겠습니다. Search Database에 있는 Table에서 검색 조건에 맞는 데이터만 조회(select) 하기 위해서는 SELECT 할 때 WHERE 절을 사용하면 됩니다. 일반적인 게시판에서 공통적으로 많이 사용하는 검색 조건은 게시물의 제목 또는 내용에 검색하고자 하는 키워드가 있는지입니다. 구분하여 설명하면, 검색 타입은 Table에서 검색할..

Spring에 DAO - Interface, Implement 추가

MyBatis의 Configuration과 Mapper XML 파일을 통해 생성된 SqlSession과 Board Model를 사용하여 데이터를 처리하는 DAO(Data Access Object - 데이터 접근 객체, 다오) Interface(인터페이스)와 Implements(구현체)를 만들겠습니다. 먼저 DAO에 대해 알아보겠습니다. DAO DAO(Data Access Object - 데이터 접근 객체, 다오)는 J2EE(Java 2 Platform, Enterprise Edition) Patterns(패턴) 중 하나로 비즈니스 로직과 데이터베이스를 분리하여 처리할 수 있는 방법을 제시합니다. DAO는 DataSource(데이터소스)와 연결하여 데이터를 등록(insert), 조회(select), 수정(..

Spring에 Model, Mapper XML 추가

이번에는 Spring-MyBatis를 이용하여 MariaDB에서 Query(쿼리)를 실행하여 데이터를 가져오도록 하겠습니다. 이전 "Maven Spring Project에 MariaDB JDBC(Java Database Connectivity) 적용"에서 MariaDB에 study란 이름으로 Database를 생성하고 INT_BOARD_TB란 게시판 Table를 생성하였습니다. CREATE DATABASE study; CREATE TABLE study.INT_BOARD_TB ( BRD_SEQ BIGINT auto_increment NOT NULL COMMENT '게시판 시퀀스', BRD_SUBJECT VARCHAR(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_general..

Spring에 MyBatis 적용 (MyBatis 3.5.10, MyBatis-Spring 2.0.7, spring-jdbc 5.2.22)

Spring Framework에서 MyBatis을 사용하기 위해서는 MyBatis와 MyBatis를 연동하여 처리해 주는 MyBatis-Spring, 데이터베이스를 처리(Transaction - 트랜잭션)해주는 Spring-JDBC가 필요합니다. 그럼 MyBatis-Spring에 대해 알아보겠습니다. MyBatis-Spring MyBatis-Spring integrates MyBatis seamlessly with Spring. This library allows MyBatis to participate in Spring transactions, takes care of building MyBatis mappers and SqlSessions and inject them into other beans, ..

Spring에 DataSource (Apache Common DBCP2 - 2.9.0) 적용

DataSource A factory for connections to the physical data source that this DataSource object represents. An alternative to the DriverManager facility, a DataSource object is the preferred means of getting a connection. An object that implements the DataSource interface will typically be registered with a naming service based on the Java™ Naming and Directory (JNDI) API. DataSource 객체는 물리적 데이터 소스..

Spring에 MariaDB JDBC(Java Database Connectivity) 적용 (mariadb-java-client 3.0.5)

JDBC (Java Database Connectivity) JDBC (Java Database Connectivity) is the Java API that manages connecting to a database, issuing queries and commands, and handling result sets obtained from the database. JDBC(자바 데이터베이스 연결)는 데이터베이스 연결과 쿼리 및 명령 실행 그리고 데이터베이스로부터 얻은 결과 집합 처리를 관리하는 Java API입니다. JDBC Driver JDBC 드러이버는 자바 프로그램의 요청을 DBMS(Database Management System - 데이터베이스 관리 시스템)가 이해할 수 있는 Protocol(프..

Spring에 SiteMesh 적용 (SiteMesh 3.0.1)

SiteMesh (사이트메쉬) SiteMesh is a web-page layout and decoration framework and web-application integration framework to aid in creating sites consisting of many pages for which a consistent look/feel, navigation and layout scheme is required. https://en.wikipedia.org/wiki/SiteMesh SiteMesh(사이트메쉬)는 일관된 룩앤필(Look and Feel), 내비게이션, 레이아웃 스키마가 필요하는 많은 페이지로 구성된 사이트를 만드는 것을 지원해 주는 프레임워크(웹 페이지의 레이아웃과 데코레이션 ..

Spring에 Filter 적용 (javax.servlet.Filter)

Filter (필터 - javax.servlet.Filter) Filter(필터)는 웹 브라우저(Web Browser)에서 Servlet에 Request(요청) 하기 전이나 Servlet에서 웹 브라우저로 Response(응답) 하기 전에 필터링(별도의 작업을 처리)합니다. 그래서 Filter(필터)는 Servlet 보다 먼저 처리됩니다. 이것을 서블릿 필터(Servlet Filter)하고 합니다. Filter(필터)는 Request(요청)과 Response(응답) 사이에서 처리됩니다. Web Browser → Filter1 → Servlet → Filter1 → Web Browser Filter(필터)는 여러 개를 설정할 수 있고 설정 순서에 따라 처리 순서가 정해집니다. 이것을 FilterChain(..

Spring에 JSTL(JavaServer Pages Standard Tag Library) 적용 (JSTL 1.2)

JSTL (JavaServer Pages Standard Tag Library - 자바서버 페이지 표준 태그 라이브러리) The JavaServer Pages Standard Tag Library (JSTL) encapsulates, as simple tags, core functionality common to many JSP applications. For example, instead of suggesting that you iterate over lists using a scriptlet or different iteration tags from numerous vendors, JSTL defines a standard tag that works the same everywhere. This st..

Spring에 DispatcherServlet 적용 (Servlet, Component-Scan, ViewResolver), Controller 추가

스프링 프레임워크(Spring Framework)의 DispatcherServlet에 대해 알아보겠습니다. Spring Framework Web MVC에서는 DispatcherServlet이 Central Servlet(중앙 서블릿)으로 Controller 역할을 하여 모든 요청(Request)을 받고 요청 URL과 매핑된 Controller로 연결시켜(서비스별로 분산시켜) 주고 처리된 결과(Model)를 화면(View)으로 처리(Rendering) 하여 응답(Response) 합니다. 웹 브라우저 요청부터 응답까지 처리되는 순서는 다음과 같습니다. Web Browser → Request(요청) → 해당 요청을 매핑한 컨트롤러 검색 → 컨트롤러 처리(View 이름 리턴) → View 검색 → View 처..

Spring에 Servlet, Build Plugin, web.xml 적용 (javax.servlet-api 3.1.0, maven-compiler-plugin)

Maven Spring Project에 Servlet 적용하기 1. 메이븐 리포지토리(https://mvnrepository.com)에서 "javax.servlet"를 검색합니다. 검색된 결과 중에 "Java Servlet API"를 선택하고 "Version"중에서 "3.1.0"를 선택합니다. 그리고 Maven 탭을 선택하고 복사합니다. javax.servlet javax.servlet-api 3.1.0 provided 2. 메이븐 프로젝트에서 pom.xml 파일을 오픈하고 복사한 내용을 붙여 넣기하고 저장합니다. 그러면 자동으로 Spring Framework 라이브러리 파일(JAR)들이 다운로드됩니다. javax.servlet-api-3.1.0.jar 메이븐 프로젝트에서 "Maven Update Pro..

Eclipse에 Spring Framework 적용 (spring-webmvc 5.2.22)

먼저 메이븐(Maven)에 대해 알아보겠습니다. Maven (Apache Maven - 메이븐) Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project's build, reporting and documentation from a central piece of information. https://maven.apache.org 소프트웨어 프로젝트 관리(management and comprehension) 도구로써 프로젝트 객체 모델(POM, Project Object Model)의 개념을 기반..

728x90
728x90