반응형

가장 기본적인 테이블인 고객 테이블이랑 상품 테이블부터 만들도록 하겠습니다.

 

Maria DB - 데이터베이스 테이블 만들기

 

userTable

CREATE TABLE userTable (
	userId VARCHAR(20),
	userPw VARCHAR(20) NOT null,
	userPw1 VARCHAR(20) NOT null,
	userTel VARCHAR(20) NOT NULL,
	userGender VARCHAR(10) NOT NULL,
	userEmail VARCHAR(50) NOT NULL,
	userAddr1 VARCHAR(20) NOT NULL,
	userAddr2 VARCHAR(20) NOT NULL,
	registerDate DATE DEFAULT NOW(),
 	CONSTRAINT userTable_userId_pk PRIMARY KEY(userId)
	) charset=UTF8;

용도 : 회원 가입시에 사용하기 위함

 

userTable 구성 :

- 고객아이디

- 고객비밀번호

- 고객비밀번호 재확인

- 고객 휴대폰번호

- 고객성별

- 고객 이메일

- 고객주소

- 고객세부주소

- 회원가입 날짜

 

 

productTable

CREATE TABLE productTable (
	prdNum INT auto_increment,
	prdName VARCHAR(20) NOT null,
	categoryCode VARCHAR(20) NOT null,
	prdPrice int,
	prdCount int,
	prdinfor VARCHAR(300) NOT NULL,
	prdImg VARCHAR(200) NOT NULL,
	prdregisterDate DATE DEFAULT NOW(),
 	CONSTRAINT productTable_prdNum_pk PRIMARY KEY(prdNum)
	) charset=UTF8;

용도 : 상품들을 홈페이지에 노출 시키고 등록하기 위함

 

productTable 구성:

- 상품번호

- 상품이름

- 상품카테고리

- 상품가격

- 상품개수

- 상품정보

- 상품이미지

- 상품등록일

 

reviewTable

CREATE TABLE reviewTable (
	reNum INT AUTO_INCREMENT PRIMARY key,
	reTitle VARCHAR(20) NOT null,
	reUser VARCHAR(20) NOT null,
	reregisterDate DATE DEFAULT NOW(),
	reCnt INT DEFAULT 0 # 조회수
	) charset=UTF8;

옹도 : 고객들의 문의 게시판

 

reviewTable 구성

- 문의 글 번호

- 문의 글 제목

- 문의 글 작성자

- 문의 등록일

- 문의 조회수

 

 

MariaDB를 사용하기 위한 Pom.xml 설정
<!-- https://mvnrepository.com/artifact/org.mariadb.jdbc/mariadb-java-client -->
		<dependency>
			<groupId>org.mariadb.jdbc</groupId>
			<artifactId>mariadb-java-client</artifactId>
		</dependency>

 

Java 파일 생성

userVo.java

productVo.java

reviewVo.java

 

여기서 각각 3개씩 만들었지만 우선 게시판과 하는 일이 비슷한 리뷰 테이블로 테스트 해보겠습니다.

Mapper 설정

pom.xml 추가 Mybatis 연동을 위한 설정

		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>2.1.2</version>
		</dependency>

 

 - 위치 : src/main/resources/mappers/reviewMapper.xml
 - 쿼리문의 id와 mapper interface의 메서드명과 일치시킬 것

<?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="com.example.mall.mapper.reviewmapper">
	<select id="reviewlist" resultType="reviewVo">
		select * from reviewTable 
	</select>
</mapper>

 

application.properties 내용 추가

# mybatis entity scan packages 뜻 Model Class Package 경로
# 선택사항입니다. 하지만 사용하지 않으면 mapper 쿼리문마다 Model 클래스 경로 작성
mybatis.type-aliases-package=com.example.mall.domain

# where mapper
# mybatis.mapper-locations : mapper.xml 경로 작성
# 현재 저는 resources경로 밑에 mappers 폴더 하위 전부를 포함하는 의미로 사용했습니다.
mybatis.mapper-locations=mappers/**/*.xml
com.example.mall.mappers.userMapper는 src/main/resources 밑에 mappers폴더를 만들고 xml 파일명

 

위치 : src/main/java 밑에 mapper 폴더 생성 후 아래와 같이 작성

reviewmapper.java

package com.example.mall.mapper;

import java.util.List;

import com.example.mall.domain.reviewVo;

public interface reviewmapper {
	
	// 문의 글 조회
	public List<reviewVo> reviewlist() throws Exception;
}

 

reviewService.java

위치 src/main/java 밑에 repository 폴더 생성 후 아래와 같이 작성

package com.example.mall.repository;

import java.util.List;

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

import com.example.mall.domain.reviewVo;
import com.example.mall.mapper.reviewmapper;


@Service
public class reviewService {

	@Autowired
	private reviewmapper reviewmapper;
	
	// 게시글 조회
	public List<reviewVo> reviewlist() throws Exception {
		// mapper 패키지 안의 reviewmapper.java의 문의글 조회  reviewlist메소드와 일치
		return reviewmapper.reviewlist();
	}
}

 

Controller 작성
package com.example.mall.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import com.example.mall.domain.reviewVo;
import com.example.mall.repository.reviewService;

@Controller
@EnableAutoConfiguration
public class reviewController {
	
	@Autowired
	private reviewService reviewservice;
	
	@GetMapping("/")
	public ModelAndView relist() throws Exception{
		ModelAndView mav = new ModelAndView("list");
		List<reviewVo> reviewlist = reviewservice.reviewlist();
		mav.addObject("relist",reviewlist);
		
		return mav;
	}
}

 

Spring boot 의 templates 에서 jsp가 작동하지 않으므로 다음과 같이 설정

pom.xml 에 내용 추가

		<dependency>
			<groupId>org.apache.tomcat.embed</groupId>
			<artifactId>tomcat-embed-jasper</artifactId>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jstl</artifactId>
		</dependency>

추가 후 src/main 폴더 밑에 차례대로 폴더를 생성해줍니다.

webapp -> WEB-INF -> views

application.properties에 다음의 내용 추가

spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp

 

총 폴더는 다음과 같다.

 

현재 제 reviewTable의 값들은 다음과 같습니다.

 

jsp 파일 생성 후 웹상으로 출력하도록 하겠습니다.

list.jsp

 

출력 결과

휴 성공,,

+ 추가적으로 콘솔에 SQL문이 실행되는지 보고싶다면

pom.xml 에 다음 내용을 추가

		<!-- MyBatis sql pretty -->
		<dependency>
			<groupId>org.bgee.log4jdbc-log4j2</groupId>
			<artifactId>log4jdbc-log4j2-jdbc4</artifactId>
			<version>1.16</version>
		</dependency>

 

resources 폴더 밑에 2개의 파일은 만들어줍니다.

log4jdbc.log4j2.properties

log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
log4jdbc.dump.sql.maxlinelength=0

 

logback-spring.xml

<configuration>
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%d{yyyyMMdd HH:mm:ss.SSS} [%thread] %-3level %logger{5} - %msg %n</pattern>
    </encoder>
  </appender>
  
  <logger name="jdbc" level="OFF"/>
  
  <logger name="jdbc.sqlonly" level="OFF"/>
  <logger name="jdbc.sqltiming" level="DEBUG"/>
  <logger name="jdbc.audit" level="OFF"/>
  <logger name="jdbc.resultset" level="OFF"/>
  <logger name="jdbc.resultsettable" level="DEBUG"/>
  <logger name="jdbc.connection" level="OFF"/>
  
  <root level="INFO">
    <appender-ref ref="STDOUT" />
  </root>
  
</configuration>

 

콘솔 로그창

 

 

 
반응형
반응형

GET과 POST의 공통점서버에 Request 요청을 하는 메소드라점입니다.

 

Ex) 홈페이지에 로그인 등의 작업을 처리할때 사용자(클라이언트)가 폼을 작성후 요청(Request)하는 동작을 의미합니다.

 

GET이 POST와의 차이점클라이언트의 요청이 URL 뒤에 추가되어서 요청되는 점입니다.

 

GET 방식(가져온다) 의 특징으로는 SELECT 쿼리문과 유사한 성격을 가지며, POST보다 전송속도가 빠르다.

왜냐하면, GET 방식은 캐싱(한번 접근 후, 또 요청할 시 빠르게 접근하기 위해 데이터를 저장시켜 놓는다) 에 의하여 빠른효과를 나타냅니다.

 

ex) www.xxx.com?id=aaa&bbb=111 과 같이 작성됩니다. 

 

위 예와 같이 도메인 뒤에 ?가 붙여지며 ?  뒤는 데이터가 들어온다는 것을 의미합니다.

 

URL 형태로 출력되기 때문에 특정 페이지를 타인이 접속 가능하며, URL의 길이가 한정되어있기 때문에 보내는 양의 한계가 존재합니다.

 

반면, POST 방식(수행한다)URL이 아닌 BODY에 데이터를 넣어서 숨겨진 상태로 전송해주는 방식입니다.

보통 HTML에서 form 형태를 이용하여 submit을 사용합니다.

 

<h3> * 방명록 글쓰기 *</h3>
<form action="/guest/insertok" method="post"> <!-- 위조 방지로 다음 문장 작성 --> {% csrf_token %} 
  <table>
    <tr>
      <td>제목</td>
	  <td><input type="text" name="title" size="50"></td>
	</tr>
	<tr>
	  <td>글내용</td>
	  <td><textarea rows='5' cols='50' name="content"></textarea></td>
	</tr>
	<tr>
	  <td colspan="2" style="text-align: center;">
	  <input type="submit" value = "등록">
	  </td>
    </tr>
	</table>
</form>

위 작성한 Template 소스중 하나입니다. 여기서 제목 내용을 작성후 submit을 누르면 아래의 view를 거치도록 되어있습니다.

 

Django에서 POST 방식을 수행하고 싶은 경우, 사이버공격으로부터 방어하기 위해 Spring 프레임워크와 다르게 form 태그 끝에 {% csrf_token %} 을 작성해주어야한다.

 

csrf란 특정 사용자를 대상으로 하지 않고, 불특정 다수를 대상으로 로그인된 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위(수정, 삭제, 등록, 송금 등)를 하게 만드는 공격을 뜻합니다.

def InsertOkFunc(request):
    if request.method == 'POST':
        #print(request.POST.get('title')) # 밑과 같은 뜻
        #print(request.POST['title'])
        Guest(
                title = request.POST.get('title'), #.POST['title'],
                content = request.POST.get('content'),
                regdate = datetime.now()
                
        ).save() # ORM추가
        return HttpResponseRedirect('/guest') # 추가후 목록 보기로 돌아감
    else:
        return HttpResponseRedirect('/guest/insert')

 

View에서 POST방식으로 request 받은 내용들을 ORM 함수중 하나인 .save() 를 거쳐서 DB에 저장되도록 하였습니다.

 

반응형

'Django' 카테고리의 다른 글

[Django] URLS  (0) 2020.05.21
[Dango] DB 연결 및 Migrate  (0) 2020.05.21
[Django] Model  (0) 2020.05.20
[Django] Template  (0) 2020.05.19
[Django] View  (0) 2020.05.19

+ Recent posts