분류 전체보기

반응형

입력한 날짜(yyyyMMdd)가 유효한 날짜인지 검사

function is_valid_date(date_str)
{
    var yyyyMMdd = String(date_str);
    var year = yyyyMMdd.substring(0,4);
    var month = yyyyMMdd.substring(4,6);
    var day = yyyyMMdd.substring(6,8);

    if (!is_number(date_str) || date_str.length!=8)
        return false;

    if (Number(month)>12 || Number(month)<1)
        return false;

    if (Number(last_day(date_str))<day)
        return false;

    return true;
}

 

yyyy-MM-dd 날짜 문자열을 Date형으로 반환

function to_date2(date_str)
{
    var yyyyMMdd = String(date_str);
    var sYear = yyyyMMdd.substring(0,4);
    var sMonth = yyyyMMdd.substring(5,7);
    var sDate = yyyyMMdd.substring(8,10);

    //alert("sYear :"+sYear +"   sMonth :"+sMonth + "   sDate :"+sDate);
    return new Date(Number(sYear), Number(sMonth)-1, Number(sDate));
}

일 차이 : date2(일) - date1(일)

function between_date(date1, date2)
{   
    var y1970 = new Date(1970, 0, 1).getTime();
    var time1 = null;
    var time2 = null;

    if(date1.length > 8)
        time1 = to_date2(date1).getTime() - y1970;
    else
        time1 = to_date(date1).getTime() - y1970;
   
    if(date2.length > 8)
        time2 = to_date2(date2).getTime() - y1970;
    else
        time2 = to_date(date2).getTime() - y1970;

    var per_day = 1000 * 60 * 60 * 24;              // 1일 밀리초

    return Math.floor(time1/per_day) - Math.floor(time2/per_day);
}

 

yyyyMMdd 날짜 문자열을 Date형으로 반환

function to_date(date_str)
{
    var yyyyMMdd = String(date_str);
    var sYear = yyyyMMdd.substring(0,4);
    var sMonth = yyyyMMdd.substring(4,6);
    var sDate = yyyyMMdd.substring(6,8);

    return new Date(Number(sYear), Number(sMonth)-1, Number(sDate));
}

 

yyyyMMdd 날짜문자열을 gubun으로 포맷을 변경

function to_date_format(date_str, gubun)
{
    var yyyyMMdd = String(date_str);
    var sYear = yyyyMMdd.substring(0,4);
    var sMonth = yyyyMMdd.substring(4,6);
    var sDate = yyyyMMdd.substring(6,8);

    return sYear + gubun + sMonth + gubun + sDate;
}

 

Date형을 yyyyMMdd형의 문자열로 변환

function get_date_str(date)
{
    var sYear = date.getFullYear();
    var sMonth = date.getMonth() + 1;
    var sDate = date.getDate();

    sMonth = sMonth > 9 ? sMonth : "0" + sMonth;
    sDate  = sDate > 9 ? sDate : "0" + sDate;
    return sYear + sMonth + sDate;
}

 

Date형을 구분자로 구분된 형식의 날짜 문자열 변환

function get_date_str_gubun(date, gubun)
{
    var sYear = date.getFullYear();
    var sMonth = date.getMonth() + 1;
    var sDate = date.getDate();

    sMonth = sMonth > 9 ? sMonth : "0" + sMonth;
    sDate  = sDate > 9 ? sDate : "0" + sDate;
    return sYear + gubun + sMonth + gubun + sDate;
}

 

오늘 날짜를 yyyyMMdd형의 문자열로 변환

function get_today()
{
    return get_date_str(new Date());
}

 

주어진 날짜가 윤년인지를 검사

function is_leap_year(date_str)
{
    var year = date_str.substring(0,4);
    if (year%4 == 0)
    {
        if (year%100 == 0)
            return (year%400 == 0);
        else
            return true;
    }
    else
        return false;
}

 

주어진 날짜(yyyyMMdd, yyyyMM) 그 달의 마지막 날짜를 반환

function last_day(date_str)
{
    var yyyyMMdd = String(date_str);
    var days = "31";
    var year = yyyyMMdd.substring(0,4);
    var month = yyyyMMdd.substring(4,6);

    if (Number(month) == 2)
    {
        if (is_leap_year(year+month+"01"))
            days = "29";
        else
            days = "28";
    }
else if (Number(month) == 4 || Number(month) == 6 || Number(month) == 9 || Number(month) == 11)
        days = "30";

    return days;
}

 

오늘 날짜 중 연도 반환

function get_today_year()
{
    var today = new Date();
    return today.getYear();
}

 

오늘 날짜 중 Month반환. format: MM

function get_today_month()
{
    var today = new Date();
    return (today.getMonth()+1) > 9 ?  (today.getMonth()+1) : "0" + (today.getMonth()+1)
}
반응형
반응형

InnoDB

 

개념


Transaction-safe 한 Storage Engine으로 2005년 Oracle이 Innobase를 인수한 후 Oracle의 일부가 되었으며,

MySQL 5.5 이후 기본적으로 사용되고 있다. MyISAM 보다 많은 기능을 제공한다.

(MVCC 지원, ACID Transaction 처리, FK 지원, row-level lock 등)

또한 Undo, Tablespace 등 Oracle의 개념을 많이 수용하고 있다.

사용 정책의 경우 듀얼 라이선스 정책을 취하고 있는데 GNU GPL이면서도 상업적인 용도로 판매 가능하다.

MyISAM 대비 동시처리에 효과적인 구조로 되어 있다.

예를 들어 MyISAM은 Table과 Index를 각각 다른 파일로 관리하는데 반해 InnoDB는 Tablespace 개념을 사용한다. 

 

 

사용 이유


대용량의 데이터를 컨트롤하는 경우

트랜잭션 관리가 필요한 경우

복구가 필요할 경우

정렬등의 구문이 들어가는 경우

IUD 등이 빈번하게 발생하는 경우

높은 퍼포먼스가 필요한 대용량 사이트에 적합

 

 

장점


데이터 무결성이 보장

동시성 제어가 가능

제약조건, 외래 키 생성이 가능

Row-level Lock (행 단위 Lock)을 사용하기 때문에 변경 작업(INSERT, UPDATE, DELETE)에 대한 속도가 빠름

트랜잭션을 지원해 transaction-safe 테이블 관리

MyISAM과 비슷하지만 ORACLE처럼 많은 기능을 지원

(Commit, Rollback, 장애 복구, row-level locking, 외래 키 등 다양한 기능을 지원)

 

단점


복구 방법 어려움

Dead lock 발생 가능성 있음

여러기능이 존재하므로 모델 디자인 시간↑

시스템 자원을 많이 차지함

Full-text 인덱싱이 불가능

 

생성 조건 및 지켜야 할 수칙


InnoDB table 생성시 체크할 항목

1. 테이블의 column은 1000개를 초과할 수 없다.

2. 내부 최대 Key length는  3500byte이지만, MySQL 자체는 1024byte로 제한한다

3. LongBlob 및 LongText 칼럼은 4GB 이하여야 한다.

4. Blob와 Text 칼럼을 포함한 총 length는 4G 이하여야 한다.

5. InnoDB는 내부적으로 65,535byte row-size를 지원하지만, 65,535 이상의 varchar를 포함한 칼럼은 정의할 수 없다


관련 에러

(ERROR 1114 (HY000): The table 'TBSOJM00' is full? ) 

 

원인

MySQL || MariaDB에서 테이블을 만들다 보면 4 G 이상의 크기가 되면 이런 류의 에러를 발생하게 됩니다.

이것은 테이블의 크기가 기본적으로 4GB로 되어 있기 때문에 발생하는 오류

 

해결 방법

http://blog.daum.net/_blog/BlogTypeView.do?blogid=0FcAa&articleno=12414824&categoryId=548228®dt=20150311175120


관련 에러 2

ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs

 

원인

varchar()의 MAX_ROWS 설정값을 초과한 경우에 발생하는 경우가 많습니다.

저는 DB의 데이터를 다른 서버로 이전할 경우에 종종 발생합니다. 서버별로 DB의 설정이 달라서 발생하는 것 같습니다.

 

해결 방법

1.MAX_ROWS 값을 늘린다.

해결 : https://blog.lovetonight.net/tag/MAX_ROWS

2.varchar로 선언된 컬럼을 text 또는 blob 로 변경한다.

해결 : 말 그대로 컬럼 타입을 변경하시면 됩니다.

 

varchar의 자리가 65,535가 안 되는 것 같은데 왜 에러가 났지? 하시는 분들도 있을 겁니다.

그 이유는 바로 utf8 멀티 바이트를 쓰고 계시는 거죠

utf8는 3byte씩 차지하니까 계산기에 65535/3 하시면 됩니다.

귀찮으시죠? 제가 대신했습니다.

21,845가 나옵니다. 안전하게 utf8 멀티 바이트 테이블에 varchar는 21,800까지만 쓰시면 되겠습니다.

반응형
반응형

매우 간단하지만 의외로 문법적으로 까먹거나, 처음 하시는 분들은 헷갈리기 때문에 정리합니다.

 

Spring 4편에 나왔던 게시판 만들기 예제를 이용합니다. 참고 바랍니다.

 

[Spring] 프로젝트 커뮤니티,블로그 만들기(#4)-게시판 작성,수정,삭제(CRUD) 만들기

안녕하세요 무작정 일단 따라 해 보는 Spring 커뮤니티 만들기 4탄 시작합니다. 환경 Eclipse 2019-9 Jee JDK 1.8_231 Apache Tomcat 8.5.47 MariaDB 10.4.10 MyBatis 3.2.2 + JSTL 1.2 + jackson 2.9.4 오늘의 할..

java119.tistory.com

 

1.GET 파라미터 받기


Client 코드(JSP)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="/WEB-INF/views/jstlHeader.jsp" %>
<!DOCTYPE html>
<html>
<head>
   
<meta charset="UTF-8">
<title>dashboard</title>
<style>
  table {
    width: 100%;
    border: 1px solid #444444;
  }
  th, td {
    border: 1px solid #444444;
  }
</style>
</head>
<body>
<p>환영합니다 ${sessionScope.loginUser.nickname }님 <a href="/jquery/logout">로그아웃</a></p>
<p>dashboard</p>
<div>게시글 리스트</div>
<table>
<thead><tr>
<td>제목</td>
<td>조회수</td>
<td>좋아요</td>
<td>첨부파일</td>
<td>글 작성 날짜</td>
</tr></thead>

<c:forEach var="b" items="${result }">
<fmt:formatDate value="${b.create_time}" pattern="yyyy-MM-dd HH:MM:ss" var="dateFormat_cr"/>
<tr>
<td><a href="/view/boardDetail?id=${b.id }">${b.subject }</a></td>
<td>${b.views }</td>
<td>${b.likes }</td>
<td>${b.attachments }</td>
<td>${dateFormat_cr }</td>
</tr>
</c:forEach>
</table>
<div> <a href="/view/boardwrite">글 작성하기</a></div>
</body>
</html>

중점적으로 볼 것은 <a href="/view/boardDetail?id=${b.id}">제목</a> 이 부분이죠

 

boardDetail이라는 페이지에 id 값을 보낸 겁니다.

 

 

Server(Java)

@RequestMapping(value="view/boardDetail",method = RequestMethod.GET)
	public ModelAndView boardDetail(int id) {
		System.out.println(id);
		boardService.viewsUpdate(id);
		Board result = boardService.getBoardDetail(id);
		ModelAndView mav = new ModelAndView();
		mav.addObject("result",result);
		return mav;
	}

그냥 이름에 맞게 받아주면 됩니다.

위에 보시면 id=${b.id} 부분에서 "id="라고 보내줬습니다. 그래서 id로 받은 것입니다.

타입(Type)은 자기가 원하는 값으로 받으면 됩니다. 정수면 int, 문자열이면 String

 

결과


System.out.println(id); 출력 값입니다.


 

그렇다면 GET 파라미터를 여러 개 보낼 땐 어떻게 할까요?

2.GET 파라미터 여러 개 받기


두 번째 파라미터부턴 &(ampersand) parameter='value'포맷으로 사용하면 됩니다.

Client 코드(JSP)

<a href="/view/boardDetail?id=${b.id}&get2='stringvalue'&get3=3">제목</a>

이런 식으로 말이죠

parameter1 : id

parameter2 : get2

parameter3 : get3

 

Server(Java)

@RequestMapping(value="view/boardDetail",method = RequestMethod.GET)
	public ModelAndView boardDetail(int id,String get2,int get3) {
		System.out.println(id+","+get2+","+get3);
		boardService.viewsUpdate(id);
		Board result = boardService.getBoardDetail(id);
		ModelAndView mav = new ModelAndView();
		mav.addObject("result",result);
		return mav;
	}

 

결과



만약 받아야 하는 파라미터가 더 많다면 관리가 필요하겠죠

DTO 객체를 만들어 받을 수도 있습니다.

3.DTO(Data Transfer Object) 객체로 GET 파라미터 받기


DTO 객체

public class GET1 {

	private int id;
	private String get2;
	private int get3;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getGet2() {
		return get2;
	}
	public void setGet2(String get2) {
		this.get2 = get2;
	}
	public int getGet3() {
		return get3;
	}
	public void setGet3(int get3) {
		this.get3 = get3;
	}
	
	@Override
	public String toString() {
		return "GET1 [id=" + id + ", get2=" + get2 + ", get3=" + get3 + "]";
	}
	
}

Server(Java)

@RequestMapping(value="view/boardDetail",method = RequestMethod.GET)
	public ModelAndView boardDetail(GET1 getTest) {
		System.out.println(getTest);
		boardService.viewsUpdate(getTest.getId());
		Board result = boardService.getBoardDetail(getTest.getId());
		ModelAndView mav = new ModelAndView();
		mav.addObject("result",result);
		return mav;
	}

 

결과


 

반응형
반응형

환경

Eclipse Version: 2019-09 R (4.13.0)

 

지극히 개인적인 자주 쓰는 단축키 모음

 

자동 완성 기능


현재 사용할 수 있는 객체, 만들 수 있는 객체 or Java에서 제공해주는 기본 객체

Ctrl + spacebar 

VS의 비주얼 어시스트와 동일한 기능

주석 처리


(자바를 예로 들은 것이고 XML, JSP에서 진행하면 그에 맞는 주석이 달립니다.)

 

한 줄 주석

Ctrl + /

//		String col = null;

여러 줄 주석

Ctrl + Shift + /

/*
* String col = null;
* 
* col = "userId";
*/

 

여러 줄 주석 해제

Ctrl + Shift + \(역 슬래쉬)

 

특정 라인 코드 이동 및 복사, 삭제


특정 라인 한 줄 이동

alt + 방향키(위, 아래)

 

특정 라인 코드 복사 (위 누르면 위로 복사 아래 누르면 아래로 복사)

Ctrl + alt + 방향키(위, 아래)

 

특정 라인 한 줄 삭제

Ctrl + D

 

Undo(되돌리기) || Redo(앞으로)


되돌리기(Undo)

Ctrl + Z

 

앞으로(되돌리기를 취소)(Redo)

Ctrl + Y

 

System.out.println() 자동 완성


sysout + Ctrl+Spacebar

sysout 입력 후 Ctrl + spacebar

 

특정 문자열 찾기


특정 문자열 찾을 파일 클릭 후 Ctrl + F

Find input 창 : 찾을 문자열 내용

입력 후 Enter or Find 버튼 클릭

 

특정 문자열을 다른 문자열로 변경하기


특정 문자열 찾을 파일 클릭 후 Ctrl + F

Find input 창 : 찾을 문자열 내용

Replace with : 찾은 문자열을 바꿀 내용(바꾸려는 문자열)

설명 : 해당 파일에 있는 userNicknameCheck 문자열을 userNick으로 바꾼다.

Replace : 제일 먼저 찾는 한 개의 문자열만

Replace All : 이 파일에 있는 모든 특정 문자열을 변경한다.

프로젝트 전체에서 특정 문구(텍스트) 포함 File 검색 


검색할 프로젝트 클릭 후

 

단축키 사용 : Ctrl + H

OR

아이콘 클릭  

 

File Search 탭 클릭

Containing text : 검색할 문구(텍스트) 입력

 

입력 후 Search 버튼 클릭

 

검색 옵션 살펴보기

Case sensitive(체크박스) : 대문자/소문자를 구분할 것인가? 

Regular expression(체크박스) : 정규식 확인할 것인가? (정규식으로 검색할 것인가?)

 

Regular expression 참고 블로그

http://blog.naver.com/PostView.nhn?blogId=korhjkim&logNo=40179239376&redirect=Dlog&widgetTypeCall=true
https://lng1982.tistory.com/159

 

Whole word(체크박스) : 특정 단어로 끝나는 것(잘리는 것)으로 검색할 것인가?

-예) "Whole" 단어를 검색했을 때 

Whole word 옵션을 체크 안 했을 경우 "Whole" 단어를 포함한 전체로 검색됨 Whole word,Whole~

Whole word 옵션을 체크했을 경우 "Whole" 단어로 딱 잘린 것들만 검색됨 포함 X

원하는 라인 줄로 이동(Go to Line)


원하는 라인으로 이동

Ctrl + L

 

import 코드 정리


Ctrl + Shift + O

import 코드 정리 전 (쓰지 않는 import라 노란 줄이 떠 있다.)

import 코드 정리 후

 

코드 들여 쓰기(정리하기)


Ctrl + Shift + F

 

들여 쓰기 전

들여 쓰기 후


단축키만 잘 써도 개발 시간을 확 줄일 수 있는데요, 자주 애용하셨으면 좋겠습니다.

아 인텔리제이 쓰신다고요? 죄송합니다.

 

일단 지금은 이 정도까지 생각이 나네요... 더 생각나면 추가하겠습니다.

반응형
반응형

먼저 선행돼야 할 가장 기본인 타깃(id, name, class) 접근 방법

id 접근 $(“#id”)

$("#notifi")

class로 접근 $(“.class”)

$(".notifi")

name으로 접근 $(tag_name[name=name])

 $("input[name=notifi]")

 

특정 아이디 기준으로 설명합니다.

 

특정 아이디 클래스


클래스 추가

$("#notifi").addClass('active');

여러 클래스 추가 (스페이스(공백) 구분)

$("#notifi").addClass('active active2 active3');

변경

$("#notifi").attr('class','active');

삭제

$("#notifi").removeClass('active');

Toggle

id 'notifi'라는 태그가 'active'라는 클래스를 가지고 있다면 없어지고,

'active'라는 클래스가 없다면 'active'라는 클래스를 해당 태그에 만든다.

$("#notifi").toggleClass('active')

특정 아이디에 특정 클래스이 존재하는지 체크


id 'notifi'라는 태그의 'active'라는 클래스가 존재하는가?

3가지 방법

 

hasClass 

if($("#notifi").hasClass("active") === true) {
// Method 실행
}

is  

if($("#notifi").is(".active") === true) {
// Method 실행
}

length 

if($("#notifi.active").length) {
// Method 실행
}

 

 

반응형
반응형

먼저 사용할 방식은 jQuery를 이용한 val() 방식을 사용합니다.

조금 코드를 수정하셔서 매개변수로 password 값을 받으셔도 됩니다.

 

공통 HTML

<input type="text" id="id">
<input type="password" id="password">
<button onclick="chkPW()">signUp</button>

 

1. 조건


필수 항목


영문(대소문자) 포함

숫자 포함

특수 문자 포함

공백 X

비밀번호 자리 8~20자

function chkPW(){

 var pw = $("#password").val();
 var num = pw.search(/[0-9]/g);
 var eng = pw.search(/[a-z]/ig);
 var spe = pw.search(/[`~!@@#$%^&*|₩₩₩'₩";:₩/?]/gi);

 if(pw.length < 8 || pw.length > 20){

  alert("8자리 ~ 20자리 이내로 입력해주세요.");
  return false;
 }else if(pw.search(/\s/) != -1){
  alert("비밀번호는 공백 없이 입력해주세요.");
  return false;
 }else if(num < 0 || eng < 0 || spe < 0 ){
  alert("영문,숫자, 특수문자를 혼합하여 입력해주세요.");
  return false;
 }else {
	console.log("통과"); 
    return true;
 }

}

$("#password").val()을 사용하기 때문에 jQuery 라이브러리 필요

 

 

2.조건


필수 항목


영문,숫자,특수문자 중 2가지 혼합 (영문,숫자 = 통과) (특문,숫자 = 통과)

비밀번호 10~20자리

function chkPW(){

 var pw = $("#password").val();
 var num = pw.search(/[0-9]/g);
 var eng = pw.search(/[a-z]/ig);
 var spe = pw.search(/[`~!@@#$%^&*|₩₩₩'₩";:₩/?]/gi);

 if(pw.length < 10 || pw.length > 20){
  alert("10자리 ~ 20자리 이내로 입력해주세요.");
  return false;
 }else if(pw.search(/\s/) != -1){
  alert("비밀번호는 공백 없이 입력해주세요.");
  return false;
 }else if( (num < 0 && eng < 0) || (eng < 0 && spe < 0) || (spe < 0 && num < 0) ){
  alert("영문,숫자, 특수문자 중 2가지 이상을 혼합하여 입력해주세요.");
  return false;
 }else {
	console.log("통과");	 
 }

}

 

 

3.조건


필수 항목


비밀번호 8자리 이상

숫자 포함

영대 문자 포함

영소 문자 포함

특수문자 포함

function chkPW(){

var reg = /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,}$/;

var pw = $("#password").val();

if(false === reg.test(pw)) {
alert('비밀번호는 8자 이상이어야 하며, 숫자/대문자/소문자/특수문자를 모두 포함해야 합니다.');
}else {
console.log("통과");
}

}

 

 

4.조건


특수문자+영문+숫자 혼합

같은 문자 4번 반복 X

아이디 포함 X

function chkPW(){

		var pw = $("#password").val();
		var id = $("#id").val();
	    var checkNumber = pw.search(/[0-9]/g);
	    var checkEnglish = pw.search(/[a-z]/ig);
	 
	    if(!/^(?=.*[a-zA-Z])(?=.*[!@#$%^*+=-])(?=.*[0-9]).{8,25}$/.test(pw)){            
	        alert('숫자+영문자+특수문자 조합으로 8자리 이상 사용해야 합니다.');
	        return false;
	    }else if(checkNumber <0 || checkEnglish <0){
	        alert("숫자와 영문자를 혼용하여야 합니다.");
	        return false;
	    }else if(/(\w)\1\1\1/.test(pw)){
	        alert('같은 문자를 4번 이상 사용하실 수 없습니다.');
	        return false;
	    }else if(pw.search(id) > -1){
	        alert("비밀번호에 아이디가 포함되었습니다.");
	        return false;
	    }else {

		console.log("통과");
		
		}

}

 

5.헬(끝판)


비밀번호 8자리 이상

숫자 포함

영대 문자 포함

영소 문자 포함

특수문자 포함

공백 X

같은 문자 4번 반복 X

아이디 포함 X

한글 X

function chkPW(){

	var pw = $("#password").val();
	var id = $("#id").val();
		
	var reg = /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,}$/;
	var hangulcheck = /[ㄱ-ㅎ|ㅏ-ㅣ|가-힣]/;
	 
	if(false === reg.test(pw)) {
	alert('비밀번호는 8자 이상이어야 하며, 숫자/대문자/소문자/특수문자를 모두 포함해야 합니다.');
	}else if(/(\w)\1\1\1/.test(pw)){
	 alert('같은 문자를 4번 이상 사용하실 수 없습니다.');
	 return false;
	 }else if(pw.search(id) > -1){
	 alert("비밀번호에 아이디가 포함되었습니다.");
	  return false;
	 }else if(pw.search(/\s/) != -1){
	 alert("비밀번호는 공백 없이 입력해주세요.");
	 return false;
	 }else if(hangulcheck.test(pw)){
	 alert("비밀번호에 한글을 사용 할 수 없습니다."); 
	 }else {
	 console.log("통과");
	 }

}

 

 

끝 마치며..


실컷 설명해놓고 찬 물 끼얹는 소리일 수 있지만 시간이 촉박한 SI가 아닌 이상 프런트인 JavaScript단에서

유효성 검사를 하기보단 백 엔드단에서 하는 것이 바람직합니다.^^

반응형
반응형

CDATA ( <![CDATA[..]]> )

 

개념


쿼리를 작성할 때, '<', '>', '&'를 사용해야하는 경우가 생기는데 xml에서 그냥 사용할 경우 태그로 인식하는 경우가 종종 있다.. 이럴 경우 에러를 뱉어내기 때문에 '태그가 아니라 실제 쿼리에 필요한 코드'라고 알려줘야 한다. 그때 사용하는 것이 <![CDATA[...]]> 이다.

 

한 마디로 <>(부등호),&(앤드),||(오아) 등을 닫는 부등호가 아니라 문자열로 처리하라는 뜻입니다.

 

어렵게 말하자면 "XML parser" 하지 말아라 이겁니다.

 

XML parser로 인식한 괄호

 

사진을 보시면 "<" 괄호가 연녹색이네요? ? 에러가 떴네요?

맞습니다. XML parser 인식했으니 XML parser에선 "<" 태그의 시작이거든요

다른 설정들도 <내용> 포맷이잖아요

 

이해되셨지요?

 

그럼 사용해봅시다.

 

문법


<![CDATA[

쿼리 내용

]]>

 

CDATA 안에 쿼리를 사용하면 쿼리 내용의 괄호나 특수문자를 XML parser 인식하지 않고

"문자열" 인식한다 이말입니다. 문자열로!

 

 

다양한 예시


 

전체 쿼리 CDATA 사용


<select id="getUserList" resultMap="UserVO">
    <![CDATA[
    select *
    from user
    where id > 3
    ]]>
</select>

 

 

조건 중간에 CDATA 사용


if

<select id="getUser" resultType="UserVO">
select * from user
<if test="id != null">
where id  <![CDATA[<]]> 3;
</if>
</select>

choose

<select id="getUser" resultMap="UserVO">
    <![CDATA[
    select *
    from user
    where  1=1
    ]]>
    <choose>
        <when test='id != null and user_type =="1"'>
            <![CDATA[
                salary > 100
            ]]>
        </when>
        <otherwise>
            <![CDATA[
                salary < 100
            ]]>
        </otherwise>
    </choose>
</select>

 

이런 것도가능


<select id="getUser" resultType="UserVO">
SELECT *
FROM user
WHERE id <![CDATA[<]]> ;
</select>
반응형
반응형

안녕하세요 무작정 일단 따라 해 보는 Spring 커뮤니티 만들기 5탄 시작합니다.

환경

Eclipse 2019-9 Jee
JDK 1.8_231
Apache Tomcat 8.5.47
MariaDB 10.4.10 
MyBatis 3.2.2
JSTL 1.2
jackson 2.9.4

오늘의 할 

1.유저(user) 테이블 만들기
2.유저(user) 회원가입,로그인 view 만들기
3.유저(user) 회원가입,로그인 백 로직 만들기(값 req,res DB insert)

1.유저(members) 테이블 만들기


제일 먼저 회원가입 기능을 만드려면 DB 테이블을 먼저 만들어야겠죠

 

저희는 MariaDB 10.4 버전을 사용하고 있기때문에

 HeidiSQL 들어가줍니다들어가 줍니다.이제 사용법 아시죠?!

CREATE TABLE `members` (
	`id` INT(11) NOT NULL AUTO_INCREMENT,
	`userId` VARCHAR(64) NULL DEFAULT NULL,
	`password` VARCHAR(256) NULL DEFAULT NULL,
	`nickname` VARCHAR(64) NULL DEFAULT NULL,
	`email` VARCHAR(64) NULL DEFAULT NULL,
	`authority` INT(11) NULL DEFAULT NULL,
	`declaration` INT(11) NULL DEFAULT NULL,
	`last_login` TIMESTAMP NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
	`create_time` TIMESTAMP NULL DEFAULT '0000-00-00 00:00:00',
	`update_time` TIMESTAMP NULL DEFAULT '0000-00-00 00:00:00',
	PRIMARY KEY (`id`)
    UNIQUE INDEX `userId` (`userId`)
)

id : 절대 겹치지 않는 구분자 PK

userId : 유저 아이디

password : 유저 비밀번호

nickname : 유저 닉네임

email : 유저 이메일

authority : 권한(관리자, 사용자 등..)

declaration : 신고 횟수

last_login : 마지막 로그인 시간

create_time : 유저 생성한 시간(회원 가입한 시간)

update_time : 비밀번호 업데이트한 시간(n일마다 비밀번호 교체 요구 기능 만들 예정)

UNIQUE INDEX `userId` (`userId`) : 웹 로직을 피해 DB에 데이터를 넣을 경우라도 중복은 피할 수 있게 유니크 키를 넣어줍니다.

 

최종 members 테이블

10.4 UI는 참 이쁘네요 10.2에 비해..


2.유저(members) 회원가입,로그인 view 만들기


views -> user 폴더 생성

views -> user 폴더 -> login.jsp 생성

src/main/java -> controller -> UserController.java 생성

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
@RequestMapping("user/*")
public class UserController {

	
	@RequestMapping(value="user/login",method = RequestMethod.GET)
	public ModelAndView login() {
		ModelAndView mav = new ModelAndView();
		return mav;
	}
	
}

 

 

webapp -> index.jsp 수정

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<jsp:forward page="/user/login"/>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>SpringEx01 커뮤니티</title>
</head>
<body>
</body>
</html>

나중에 sitemash를 사용할 때 index.jsp는 적용하기 어렵습니다. 그러므로 jsp:forward를 통해 진입하자마자

/user/login 페이지로 forward 해줍니다.

 

 

login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script> 
<style>
body {
   font: 13px/20px 'Helvetica Neue', Helvetica, Arial, sans-serif;
   color: #333333;
   background: #596778;
}

.signUp {
   position: relative;
   margin: 50px auto;
   width: 280px;
   padding: 33px 25px 29px;
   background: #FFFFFF;
   border-bottom: 1px solid #C4C4C4;
   border-radius: 5px;
   -webkit-box-shadow: 0 1px 5px rgba(0, 0, 0, 0.25);
   box-shadow: 0 1px 5px rgba(0, 0, 0, 0.25);
}

.signUp:before,
.signUp:after {
   content: '';
   position: absolute;
   bottom: 1px;
   left: 0;
   right: 0;
   height: 10px;
   background: inherit;
   border-bottom: 1px solid #D2D2D2;
   border-radius: 4px;
}

.signUp:after {
   bottom: 3px;
   border-color: #DCDCDC;
}

.signUpTitle {
   margin: -25px -25px 25px;
   padding: 15px 25px;
   line-height: 35px;
   font-size: 26px;
   font-weight: 300;
   color: #777;
   text-align: center;
   text-shadow: 0 1px rgba(255, 255, 255, 0.75);
   background: #F7F7F7;
}

.signUpTitle:before {
   content: '';
   position: absolute;
   top: 0;
   left: 0;
   right: 0;
   height: 8px;
   background: #C4E17F;
   border-radius: 5px 5px 0 0;
   background-image: -webkit-linear-gradient(left, #C4E17F, #C4E17F 12.5%, #F7FDCA 12.5%, #F7FDCA 25%, #FECF71 25%, #FECF71 37.5%, #F0776C 37.5%, #F0776C 50%, #DB9DBE 50%, #db9CBE 62.5%, #C49CDE 62.5%, #C49CDE 75%, #669AE1 75%, #669AE1 87.5%, #62C2E4 87.5%, #62C2E4);
   background-image: -moz-linear-gradient(left, #c4e17f, #C4E17F 12.5%, #F7FDCA 12.5%, #F7FDCA 25%, #FECF71 25%, #FECF71 37.5%, #F0776C 37.5%, #F0776C 50%, #DB9DBE 50%, #DB9CBE 62.5%, #C49CDE 62.5%, #C49CDE 75%, #669AE1 75%, #669AE1 87.5%, #62C2E4 87.5%, #62C2E4);
   background-image: -o-linear-gradient(left, #C4E17F, #C4E17F 12.5%, #F7FDCC 12.5%, #F7FDCA 25%, #FECF71 25%, #FECF71 37.5%, #F0776C 37.5%, #F0776C 50%, #DB9DBE 50%, #DB9DBE 62.5%, #C49CDE 62.5%, #C49CDE 75%, #669AE1 75%, #669AE1 87.5%, #62C2E4 87.5%, #62C2E4);
   background-image: linear-gradient(to right, #C4E17F, #C4E17F 12.5%, #F7FDCA 12.5%, #F7FDCA 25%, #FECF71 25%, #FECF71 37.5%, #F0776C 37.5%, #F0776C 50%, #DB9DBE 50%, #DB9CBE 62.5%, #c49cde 62.5%, #C49CDE 75%, #669AE1 75%, #669AE1 87.5%, #62c2e4 87.5%, #62C2E4);
}

input {
   font-family: inherit;
   color: inherit;
   -webkit-box-sizing: border-box;
   -moz-box-sizing: border-box;
   box-sizing: border-box;
}

.signUpInput {
   width: 100%;
   height: 50px;
   margin-bottom: 25px;
   padding: 0 15px 2px;
   font-size: 17px;
   background: white;
   border: 2px solid #EBEBEB;
   border-radius: 4px;
   -webkit-box-shadow: inset 0 -2px #EBEBEB;
   box-shadow: inset 0 -2px #EBEBEB;
}

.signUpInput:focus {
   border-color: #62C2E4;
   outline: none;
   -webkit-box-shadow: inset 0 -2px #62C2E4;
   box-shadow: inset 0 -2px #62C2E4;
}

.lt-ie9 .signUpInput {
   line-height: 48px;
}

.loginButton {
   position: relative;
   vertical-align: top;
   width: 100%;
   height: 54px;
   padding: 0;
   font-size: 22px;
   color: white;
   text-align: center;
   text-shadow: 0 1px 2px rgba(0, 0, 0, 0.25);
   background: #CCCCFF;
   border: 0;
   border-bottom: 2px solid #D76B60;
   border-radius: 5px;
   cursor: pointer;
   -webkit-box-shadow: inset 0 -2px #D76B60;
   box-shadow: inset 0 -2px #D76B60;
}

.loginButton:active {
   top: 1px;
   outline: none;
   -webkit-box-shadow: none;
   box-shadow: none;
}

.signUpButton {
   position: relative;
   vertical-align: top;
   width: 100%;
   height: 54px;
   padding: 0;
   font-size: 18px;
   color: white;
   text-align: center;
   text-shadow: 0 1px 2px rgba(0, 0, 0, 0.25);
   background: #F0776C;
   border: 0;
   border-bottom: 2px solid #D76B60;
   border-radius: 5px;
   cursor: pointer;
   -webkit-box-shadow: inset 0 -2px #D76B60;
   box-shadow: inset 0 -2px #D76B60;
}

.signUpButton:active {
   top: 1px;
   outline: none;
   -webkit-box-shadow: none;
   box-shadow: none;
}

:-moz-placeholder {
   color: #AAAAAA;
   font-weight: 300;
}

::-moz-placeholder {
   color: #AAAAAA;
   opacity: 1;
   font-weight: 300;
}

::-webkit-input-placeholder {
   color: #AAAAAA;
   font-weight: 300;
}

:-ms-input-placeholder {
   color: #AAAAAA;
   font-weight: 300;
}

::-moz-focus-inner {
   border: 0;
   padding: 0;
}
</style>

<script type="text/javascript">

function loginValidation(){
	
	var userId = $("#userId").val();
	var password = $("#password").val();
	
	if(!userId){
		alert("아이디를 입력하세요.");
		$("#userId").focus();
		return false;
	}else if(!password){
		alert("비밀번호를 입력하세요.");
		$("#password").focus();
		return false;
	}else {
		login(userId,password);
	}
	
}

function login(userId,password){
	
	$.ajax({
		
		url : "/jquery/login",
		type : 'POST',
		data : { userId : userId, 
				password : password	
		},
		success:function(data){
			if(data == 2){
				alert("아이디 혹은 비밀번호가 맞지 않습니다.");
				return false;
			}else if(data == 3){
				location.href="/view/dashboard";
			}
		}
		
	})
	
}

function enterKeyCheck(){
	
 if(event.keyCode == 13)
	  {
	 loginValidation();
	  }
	
	
}

</script>

</head>
<body>

<form class="signUp" id="signupForm">
   <h1 class="signUpTitle">로그인</h1>
   <input type="text" id="userId" class="signUpInput" placeholder="ID" autofocus onkeyup="enterKeyCheck()">
   <input type="password" id="password" class="signUpInput" placeholder="Password" onkeyup="enterKeyCheck()">
   <input type="button" value="로그인" onclick="loginValidation()" class="loginButton">
   <input type="button" value="회원가입" onclick="location.href='/user/signUp'" class="signUpButton">
</form>

</body>
</html>

UI 코드 출처 : 블루비 웹스토어


 

views -> user 폴더 -> signUp.jsp 생성

signUp.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script> 
<meta charset="UTF-8">
<title>회원 가입</title>
<script type="text/javascript">

function signUpValidation(){
	
	var userId = $("#userId").val();
	var userPw = $("#password").val();
	var userPwCheck = $("#passwordCheck").val();
	var nickName = $("#nickname").val();
	var email = $("#email").val();
	
	if(!userId){
		alert("아이디 입력은 필수입니다.");
		$("#userId").focus();
	}else if(!userPw){
		alert("비밀번호 입력은 필수입니다.");
		$("#password").focus();
	}else if(!userPwCheck){
		alert("비밀번호 확인 입력은 필수입니다.");
		$("#passwordCheck").focus();
	}else if(userPw != userPwCheck){
		alert("비밀번호가 맞지 않습니다.");
		$("#userPwCheck").focus();		
	}else if(!nickName){
		alert("닉네임 입력은 필수입니다.");
		$("#nickname").focus();
	}else if(!email){
		alert("이메일 입력은 필수입니다.");
		$("#email").focus();
	}else {
		signUp()
	}
	
}

function signUp(){
	
	$.ajax({
		
		url : "/jquery/signUp",
		type:'POST',
		data :  $("#registerform").serialize(),
		success:function(data){
			if(data == 1){
				alert("회원가입이 완료됐습니다.^^");
				location.href = "/user/login"
			}else if(data == 2){
				alert("이미 존재하는 아이디입니다.");
				return false;
			}else if(data == 3){
				alert("이미 존재하는 닉네임입니다.");
				return false;
			}
		}
		
	})
}

</script>
</head>
<body style="background-color:#f0f5f3">
<form id="registerform">
        <div class="fieldlabel"><label for="userId">*아이디</label></div>
        <div class="formfield"><input type="text" id="userId" name="userId" maxlength="20" value=""></div>
        
        <div class="fieldlabel"><label for="password">*패스워드</label></div>
        <div class="formfield">
<input type="password" id="password" name="password" maxlength="20" autocomplete="off">
</div>

        <div class="fieldlabel"><label for="passwordCheck">패스워드확인</label></div>
        <div class="formfield">
        
<input type="password" id="passwordCheck" name="passwordCheck" maxlength="20" autocomplete="off">
</div>
       
        <div class="fieldlabel"><label for="nickname">*닉네임</label></div>
        <div class="formfield"><input type="text" id="nickname" name="nickname" maxlength="20" value=""></div>

        <div class="fieldlabel"><label for="email">*이메일</label></div>
        <div class="formfield"><input type="text" id="email" name="email" size="20" maxlength="20" 
             value="" autocomplete="off"><span>@</span>
            <input id="domain" list="domains" name="domain" placeholder="도메인입력/선택">
            <datalist id="domains">
                <option value="naver.com">
                <option value="daum.net">
                <option value="gmail.com">
                <option value="yahoo.co.kr">
            </datalist>
        </div>
       
        <div class="btnfield">
            <input type="button" onclick="signUpValidation()" value="회원가입">
        </div>
    </form>
</body>
</html>

 


3.유저(members) 회원가입,로그인 백 로직 만들기


 

src/main/java -> controller -> UserController.java 수정

UserController.java

package com.company01.springEx01.controller;

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
@RequestMapping("user/*")
public class UserController {

	
	@RequestMapping(value="user/login",method = RequestMethod.GET)
	public ModelAndView login() {
		ModelAndView mav = new ModelAndView();
		return mav;
	}
	
	@RequestMapping(value="user/signUp",method = RequestMethod.GET)
	public ModelAndView signUp() {
		ModelAndView mav = new ModelAndView();
		return mav;
	}
	
}

 

src/main/java -> controller -> JqueryController.java 수정

JqueryController.java 

package com.company01.springEx01.controller;

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 org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import com.company01.springEx01.logic.Board;
import com.company01.springEx01.logic.Members;
import com.company01.springEx01.service.BoardService;
import com.company01.springEx01.service.UserService;

@Controller
@RequestMapping("jquery/*")
public class JqueryController {

	@Autowired
	BoardService boardService;
	
	@Autowired
	UserService userService;
	
	@RequestMapping(value="jquery/boardwrite",method = RequestMethod.POST)
	@ResponseBody
	public int boardwrite(Board board) {
		int result = 0; 
		result = boardService.boardwrite(board); 
		return result;
	}
	
	@RequestMapping("jquery/logout")
	public String logout(HttpSession session) {
		session.removeAttribute("loginUser");
		return "/user/login";
	}
	
	@RequestMapping(value="jquery/login",method = RequestMethod.POST)
	@ResponseBody
	public int login(Members members,HttpSession session) {
		int result = 0; 
		String col = null;
		col = "userId";
		Members userIdCheck = userService.getUserOne(members.getUserId(),col);
		if(userIdCheck == null) {
			result = 2;
		}else {
		
		if(members.getUserId().equals(userIdCheck.getUserId())) {
			//ID OK
			if(members.getPassword().equals(userIdCheck.getPassword())) {
				//PW OK 
				session.setAttribute("loginUser", userIdCheck);

				result = 3;
			}else {
				result = 2;
			}
			
		}else {
			//ID not OK
			result = 2;
		}
		}
		
		return result;
	}
	
	@RequestMapping(value="jquery/signUp",method = RequestMethod.POST)
	@ResponseBody
	public int signUp(Members members) {
		int result = 0; 
		String col = null;
		
		col = "userId";
		Members userIdCheck = userService.getUserOne(members.getUserId(),col);
		if(userIdCheck != null) {
		result = 2; 
		}
		
		col = "nickname";
		Members userNicknameCheck = userService.getUserOne(members.getNickname(),col);
		if(userNicknameCheck != null) { result = 3; }	
		
		if(result < 2) {
		result = userService.userJoin(members);	
		}
		
		
		return result;
	}
	
}

login method

Members userIdCheck = userService.getUserOne(members.getUserId(),col);

아이디가 존재하는지 입력값을 보내 DB에서 검사합니다.

존재할 경우 

if(members.getUserId().equals(userIdCheck.getUserId())) { 아이디와 DB에 데이터 아이디와 같은지 확인
//ID OK
if(members.getPassword().equals(userIdCheck.getPassword())) { 비밀번호와 DB에 데이터 비밀번호가 같은지 확인

session.setAttribute("loginUser", userIdCheck); "세션"이라는 것에 로그인한 사용자의 정보를 담음


src/main/java -> services -> UserService.java (interface) 생성

UserService.java (interface)

package com.company01.springEx01.service;

import com.company01.springEx01.logic.Members;

public interface UserService {

	Members getUserOne(String common, String col);

	int userJoin(Members members);

}

 

src/main/java -> services -> UserServiceImpl.java 생성

UserServiceImpl.java 

package com.company01.springEx01.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.company01.springEx01.dao.UserDAO;
import com.company01.springEx01.logic.Members;

@Service
public class UserServiceImpl implements UserService {

	@Autowired
	UserDAO userDAO;

	@Override
	public Members getUserOne(String common,String col) {
		return userDAO.getUserOne(common,col);
	}

	@Override
	public int userJoin(Members members) {
		return userDAO.userJoin(members);
	}
	
}

 

src/main/java -> dao-> UserDAO.java

UserDAO.java

package com.company01.springEx01.dao;

import java.util.HashMap;

import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.company01.springEx01.logic.Members;

@Repository
public class UserDAO {

	@Autowired
	public SqlSession sqlSession;

	public Members getUserOne(String common, String col) {
		HashMap<String, Object> map = new HashMap<String, Object>();
		if(col.equals("userId")) {
			map.put("userId",common);
		}else if(col.equals("nickname")) {
			map.put("nickname",common);
		}
		return sqlSession.selectOne("getUserOne",map);
	}

	public int userJoin(Members members) {
		return sqlSession.insert("userJoin",members);
	}
	
}

 

src/main/java -> logic -> Members.java

Members.java

package com.company01.springEx01.logic;

import java.util.Date;

public class Members {

	private int id;
	private String userId;
	private String password;
	private String nickname;
	private String email;
	private int authority;
	private int declaration;
	private Date last_login;
	private Date create_time;
	private Date update_time;
	
	private String domain;
	
	get../set..
	
	
}

 

혹시 get/set 설정 모르시는 분들을 위한 설명

get/set 만들 클래스를 열은 상태에서 -> 이클립스에서 상단 메뉴 Source -> Generate and Setters... 클릭

Select All 버튼 클릭 -> Generate

 

 

src/main/resources -> mapper 폴더 -> user-Mapper.xml 생성

user-Mapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="mapper.user-Mapper">

<select id="getUserOne" resultType="members">
SELECT * FROM members 
<if test="userId != null">
where userId = #{userId};
</if>
<if test="nickname != null">
where nickname = #{nickname};
</if>
</select>

<insert id="userJoin">
insert into members (id,userId,password,nickname,email,authority,last_login,create_time,update_time)
values (#{id},#{userId},#{password},#{nickname},#{email},1,#{last_login},now(),#{update_time})
</insert>

</mapper>

 

 

spring -> mybatis 폴더 -> mybatis-config.xml 수정

mybatis-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <typeAliases>
        <typeAlias alias="board" type="com.company01.springEx01.logic.Board"/>
        <typeAlias alias="members" type="com.company01.springEx01.logic.Members"/>
    </typeAliases>

    <mappers>
        <mapper resource="mapper/board-Mapper.xml"/>
        <mapper resource="mapper/user-Mapper.xml"/>
    </mappers>
</configuration>

 

views -> view -> dashboard.jsp 수정

dashboard.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="/WEB-INF/views/jstlHeader.jsp" %>
<!DOCTYPE html>
<html>
<head>
   
<meta charset="UTF-8">
<title>dashboard</title>
<style>
  table {
    width: 100%;
    border: 1px solid #444444;
  }
  th, td {
    border: 1px solid #444444;
  }
</style>
</head>
<body>
<p>환영합니다 ${sessionScope.loginUser.nickname }님 <a href="/jquery/logout">로그아웃</a></p>
<p>dashboard</p>
<div>게시글 리스트</div>
<table>
<thead><tr>
<td>제목</td>
<td>조회수</td>
<td>좋아요</td>
<td>첨부파일</td>
<td>글 작성 날짜</td>
</tr></thead>

<c:forEach var="b" items="${result }">
<fmt:formatDate value="${b.create_time}" pattern="yyyy-MM-dd HH:MM:ss" var="dateFormat_cr"/>
<tr>
<td><a href="/view/boardDetail?id=${b.id }">${b.subject }</a></td>
<td>${b.views }</td>
<td>${b.likes }</td>
<td>${b.attachments }</td>
<td>${dateFormat_cr }</td>
</tr>
</c:forEach>
</table>
<div> <a href="/view/boardwrite">글 작성하기</a></div>
</body>
</html>

 

${sessionScope.loginUser.nickname} "세션"에 담긴 닉네임 정보가 잘 나왔나 확인하는 작업

 

 

정리

1.signUp.jsp - 회원가입 페이지 뷰

-signUp Method POST 회원가입 사용자 등록 메서드

 

2.login - 로그인 페이지 뷰

-login Method POST 로그인 성공/실패 여부

 

3.logout Method - 세션에 담긴 로그인 정보를 삭제함으로써 로그아웃 기능을 제공함.

 

 

이제 감 잡으신 분들도 있겠지만 이 방식만 외우세요!

1.jsp 데이터 넘기거나 조회 (request or response)

2.Controller에서 받음

3.Controller에서 Service에게 요청

4.ServiceImpl이 받음

5.DAO가 받음

6.DAO가 DB에게 데이터 요청

7. 다시 리턴~jsp까지 전달

 

8. 설정은 XML 파일이 한다. 인식해주는 것, 새로운 것을 등록하는 것, 뭔가 바꿔주는 것

 

어떠한 기능이든 이 방식을 따릅니다. 그 과정이 복잡해지는 거지 그 방식은 똑같습니다.


페이지 뷰


로그인

회원가입

대시보드(수정)

 

 

UI가 뒤죽박죽인 건 나중에 부트스트랩+sitemash을 이용해 다시 작업할 것입니다.

다음 글은 로그인을 만들었으니 게시판 글쓴이,신고 등 유저+게시판을 이용한 작업을 진행하겠습니다.

 

최종 Project Explorer


이제 길어져서 한 번에 못 찍네요...

반응형

+ Recent posts