반응형

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

 

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>

 

콘솔 로그창

 

 

 
반응형
반응형

1. 우선 STS를 설치하였다는 전제하에 글을 작성하고있습니다.

 

다음과 같이 실행되는 장면을 볼 수 있습니다.

 

 

자 다음과 같이 어디에 설치 할지 경로를 잡아 주도록 합니다.

 

 

 

2. [File] > [New] > [Spring Starter Project]

 

3. 설정 화면 필요한 것들을 넣어주도록 한다.

 

 

4. 실행 해주도록 합니다.

 

 

 

위와 같은 에러가 나타났습니다. 해당 오류는 Gradle 프로젝트 생성 후 DB 관련 dependencies를 설정하지 않아서 뜨는 오류입니다.

 

해결 방법: 

 

build.gradle 파일에 아래와 같은 내용을 추가해줍니다.

그리고, /src/main/resources/application.properties 안에 다음과 같은 DB 정보를 입력해주도록 합니다.

 

이후에 다시 실행해주면 성공하는 코드가 나타나야 합니다 !

 

 

5. 이제 jsp 파일을 생성해서 실행해보도록 하겠습니다.

 

아래와 같이 없는 디렉토리들을 생성해준 후 views 디렉토리 아래 테스트해볼 jsp파일을 생성해주고 안에 내용은 자신의 기호에 맞게 작성해주도록 합니다.

 

저는 아래와 같이 만들어 주었습니다.

 

<spring.jsp>

 

그 다음으로 controller 파일을 생성해주도록 하겠습니다.

 

* 중간에 디자인이 바뀐점은 제가 테마를 바꿔서 그렇습니다.

 

<testcontroller.java>

 

6. /src/main/resources/application.properties 에 다시 아래와 같은 내용을 추가 해줍니다.

 

 

이렇게 하고 실행이 되어야하는데 이러한 에러와 로그가 발생합니다.

 

해결 방법 :

 

build.gradle  dependencies 안에 내용을 추가해줍니다.

제가 공부하고자 포스팅하지만 혹시나 검색 도중 필요하신 분이 계시다면 복사 붙여넣기가 가능하실 수 있게 스크린샷이 아닌 코드블럭으로 작성하겠습니다.

	compile('org.apache.tomcat.embed:tomcat-embed-jasper')
	compile('javax.servlet:jstl:1.2')

* 주의 * 작성하신 후 해당 프로젝트 우클릭 [Gradle] -> [Refresh Gradle Project] 해주셔야합니다.

 

 

위와 같이 자신이 views 안에 만든 .jsp 파일이 정상적으로 실행되면 성공한 것입니다.

반응형
반응형

앞서 포스팅한 APP 생성, Template 설정, Model 구성이 완료가 되었다면,

 

DB 설정 및 makemigrations -> migrate 과정을 수행해주도록 하겠습니다.

 

 

- makemigrations , migrate 작업

 

모델에 만든 클래스들에 맞는 스키마를 생성하고 수정 가능하도록 하기 위해 다음과 같은 명령어를 차례대로 실행합니다

해당 명령어를 수행하면 APP 하위 폴더에 있는 migrations 폴더에 파일이 생성된 것을 확인 하실 수 있습니다.

 

python manage.py makemigrations
python manage.py migrate

 

0001_inital.py

 

- DB 설정 변경

 

urls.py 로 가서 다음과 같은 부분을 변경해주도록 합니다.

 

 

ALLOWED_HOSTS = [] 부분에는 자신의 ip 또는 127.0.0.1 을 기재 해주시거나 둘다 해당 가능하게 하고 싶다면 위의 사진처럼 '*'로 해주도록 합니다.

 

INSTALLED_APPS = [] 영역에는 자신이 만든 APP 이름을 작성해주도록 합니다.

 

 

다음으로 이 부분을 수정해주도록 합니다. 현재는 프로젝트 생성시 기본을 sqlite3으로 지정했기 때문에 다음과 같이 작성되어있습니다.

 

저는 다음과 같이 수정하였습니다.

 

 

'ENGINE' 영역 mysql 또는 mariadb 인경우 저처럼 작성해주고, 오라클의 경우에는 mysql 대신 oracle이라고 작성해주시면 됩니다.

'NAME' 에는 자신이 사용할 DB명을 입력해주도록 합니다.

그 외의 것들은 생략하도록 하겠습니다.

반응형

'Django' 카테고리의 다른 글

[Django] GET & POST 방식 웹 출력  (0) 2020.05.21
[Django] URLS  (0) 2020.05.21
[Django] Model  (0) 2020.05.20
[Django] Template  (0) 2020.05.19
[Django] View  (0) 2020.05.19
반응형

* 윈도우에서 python용 MySql(MariaDB) 드라이버 설치 방법

버전별 드라이버 다운로드 http://www.lfd.uci.edu/~gohlke/pythonlibs/

사이트에서 mysqlclient 로 검색하여 원하는 파일( mysqlclient-1..-cp3*-cp3*m-win_amd64.whl )을 다운로드하면 된다.

확장자를 zip으로 변경하고 압축을 풀어준다. 

풀린 파일과 폴더들을 복사한 후 C:\Python3*\Lib\site-packages 에 붙여넣기 하면 된다.

또는 pip install ... 해주면 된다.

이클립스에서 MariaDB를 연결하는 방법은 다음과 같습니다.

 

방법 1.

conn = MySQLdb.connect(host = '127.0.0.1', user = '사용자이름', password='비밀번호', database='DB명')

ex)
conn = MySQLdb.connect(host = '127.0.0.1', user = 'root', password='123', database='test')

또는 다음과 같이 작성해주시면됩니다.

 

config = {

    'host':'127.0.0.1',
    'user':'사용자이름',
    'password':'비밀번호',
    'database':'DB명',
    'port':3306,
    'charset':'utf8',
    'use_unicode':True
}

ex)

config = {

    'host':'127.0.0.1',
    'user':'root',
    'password':'123',
    'database':'test',
    'port':3306,
    'charset':'utf8',
    'use_unicode':True

}

 

이번에는 제가 만든 테이블에 데이터를 삽입하고 결과를 출력해보겠습니다.

 

table prac

CREATE TABLE prac(num INT(255) NOT NULL PRIMARY KEY,
NAME VARCHAR(20),
HOUR INT(11),
pay INT(11))
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;

 

 

위 DB연결 코드 밑에 데이터 삽입 SQL문을 넣고 결과를 보겠습니다

 

try:
    conn = MySQLdb.connect(**config)
    print(conn) # DB가 잘 연결되었는지 확인
    cursor = conn.cursor() # SQL문 수행을 위한 커서 객체 생성
    
   
        
except Exception as e:
    print('err : ',  e) 
    
finally:
    cursor.close()
    conn.close()

# print(conn) 의 출력 결과
<_mysql.connection open to '127.0.0.1' at 0000025181F6F578>

try문 내의 코드는 다음과 같습니다.

 

- import MySQLdb 를 하여 MySQLdb 모듈을 불러옵니다.

 

- MySQLdb.connect(**config) 메소드를 통하여 MySQL에 연결해줍니다. 호스트명, 사용자명, 암호, 접속할 DB, 포트, 등을 기재합니다.

 

- DB 접속이 성공하면, Connection 객체로부터 cursor() 메서드를 호출하여 Cursor 객체를 가져옵니다.

 

- cursor 객체를 생성하였다면 이제 이 객체로 SQL의 DML 명령어들을 다 수행할 수 있습니다.

 

이제 자료를 추가하고 수정하고 삭제하는 DML 명령어들을 작성해보겠습니다. 

 

지금부터 작성되는 내용들은 try ~ except 안에 추가로 작성해주시면됩니다.

 

1. 자료 추가 ( insert ) , 자료 조회 ( select )

방법 1.

# 자료 추가
    sql = "insert into prac(num, NAME, HOUR, pay) values (1, '홍길동',3,8000)"
    cursor.execute(sql) # 결과가 1이면 commit한다 아니면 rollback execute에 사실 리턴값이 존재
    conn.commit()
    
#select 전체자료 읽기
    sql = 'select * from prac'
    cursor.execute(sql)
    
    # 출력1 튜플 타입으로 출력된다
    for data in cursor.fetchall():
        print(data)
        
        
# 출력결과

(1, '홍길동', 3, 8000)

 insert 문을 사용하여 각각의 컬럼에 맞게 값들을 입력해주었습니다.

 

이후 cursor객체에 execute를 사용해  실행할 sql문이 들어있는 변수를 입력해줍니다.

그 후 commit() 과정을 해주어야 합니다.

그 이유는 Autocommit 이 아니기때문입니다. 자동으로 commit 실행을 하고싶다면, connect() 메서드 호출시 autocommit=True 를 지정해줍니다.

 

insert문이 잘 실행되었는지 보기 위해 select 문도 작성하고, 반복문 for을 통해 데이터가 잘 삽입 되었는지 출력해보았습니다.

 

이번에는 다른 방법으로 insert 문과 select문을 사용해보겠습니다.

방법 2.

 sql = "insert into prac values(%s,%s,%s,%s)" # 자바는 values에 ?가 들어감
    sql_data = (2, 'insert2','5', 9000)
    cursor.execute(sql, sql_data)
    conn.commit()
    
    
    
     # 출력 2 
     # 반복문 for에 cursor 객체 값들을 r에 넣고 출력
     # list로 출력
    for r in cursor: 
    
     # 배열에 저장되는 값들은 다음과 같습니다.
        print([r[0], r[1], r[2], r[3]]) # r[0] = num값 r[1] name값 r[2] HOUr값 r[3] pay값 저장     
        
# 출력 결과

[1, '홍길동', 3, 8000]
[2, 'insert2', 5, 9000]


 

방법 3.

 

    sql = "insert into prac values(%s,%s,%s,%s)" # 자바는 values에 ?가 들어감
    sql_data = '3','insert3',5,6000
    cursor.execute(sql, sql_data)
    conn.commit()

# 출력 3
# 이번에는 매핑을 이용하여 서로 값이 일치하게 저장되도록 합니다.
    for (num, NAME, HOUR, pay) in cursor:
        print(num, NAME, HOUR, pay)
       	print()

# 출력4
    for (a, b, c, d) in cursor: # 매핑한거라 값은 같게 출력
        print(a, b, c, d)

# 출력 결과

1 홍길동 3 8000
2 insert2 5 9000
3 insert3 5 6000

1 홍길동 3 8000
2 insert2 5 9000
3 insert3 5 6000

 

update / delete 문 사용 후 출력 방식은 출력 1에서 사용한 방법으로 출력하도록 하겠습니다.

 

2. UPDATE

# 자료 수정

    sql = "update prac set NAME = %s, HOUR=%s, pay=%s where num=%s"
    sql_data = ('홍씨에서이씨', 5, 10000, 1)
    cursor.execute(sql, sql_data)
    conn.commit()


    #select 전체자료 읽기
    sql = 'select * from prac'
    cursor.execute(sql)
    
    # 출력1

    for data in cursor.fetchall():
        print(data)
        
        
# 출력 결과

(1, '홍씨에서이씨', 5, 10000)
(2, 'insert2', 5, 9000)
(3, 'insert3', 5, 6000)

 

3. DELETE

 

방법 1)

 

    # 자료 삭제 
    num = '1'
    sql = "delete from prac where num = " + num #권장x
    cursor.execute(sql)
    conn.commit()


	# 출력 결과
    
    (2, 'insert2', 5, 9000)
	(3, 'insert3', 5, 6000)

 

방법 2)

 

    num = '2'

    sql = "delete from prac where num='{0}'".format(num) 
    cursor.execute(sql)
    conn.commit()
    
    
    # 출력 결과
    
    (3, 'insert3', 5, 6000)

 

방법 3)

 

    num = '3'

    sql = "delete from prac where num=%s" #가장많이 쓰는 방법 밑에 cursor와 매핑 할땐 튜플형태로 줘라
    cursor.execute(sql, (num, ))
    conn.commit()
    
    
    # 출력 결과
    
    

 

참고사이트

 

https://cafe.daum.net/flowlife

 

반응형

'python' 카테고리의 다른 글

[python] Numpy 데이터타입, 메모리저장, 배열  (0) 2020.05.28
python - Thread ( 스레드 ) (1)  (0) 2020.05.14
python - 예외처리  (0) 2020.05.11
python - OS & pickle  (0) 2020.05.11
python - 상속 (2)  (0) 2020.05.10

+ Recent posts