반응형

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

 

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>

 

콘솔 로그창

 

 

 
반응형
반응형

# Tuple ( 리스트와 유사, 읽기 전용, 중복을 허용 )

# 빠른 속도를 요구할 때 사용하면 좋다.

 

Ex 1)

1
2
3
4
5
6
= ('a''b''c''a')
 
print(t)
 
print(t, ' ' , t.count('a'),'개 ' , t.index('b'))
print(t[0])

 

출력 결과

 

 

Tuple은 읽기 전용이라 수정하면 에러가 발생합니다 ! 수정을 하고 싶다면 리스트 형태로 주어야 합니다.

 

예시. t[0] = m을 하였을 경우

리스트로 담아서 넘길 경우

 

1
2
3
4
= list(t)
q[0= 'm'
= tuple(q) # q를 tuple로 지정하여 t 에 저장
print(t)

출력결과

 

 

Ex 2)

- 변수에 요소 값이 1개를 tuple로 받아주고 싶을 경우 요소 뒤에 , 를 찍어주어야 한다.

- 그렇지 않으면 int 로 받아들여 tuple이 아니게 된다.

 

1
2
3
4
5
kk = (1)
print(kk, type(kk)) 
 
kk2 = (1,)
print(kk, type(kk), kk2, type(kk2))

 

출력 결과

 

 

집합 자료형 SET ( 순서 없고 중복도 불가능하다. 중복되는 값을 스스로 스킵한다. )

 

Ex 1)

 

1
2
3
4
5
6
7
8
9
= {1,2,3,1}
print(a)
 
= {3,4}
print(a.union(b)) # 합집합
print(a.intersection(b)) # 교집합
print(a - b, a | b,  a & b) # 차집합 / 합집합 / 교집합
 
# print(a[0]) # 순서가 없기떄문에 인덱싱 불가능

 

출력 결과

 

 

Ex 2) update remove 기능 

- SET 함수는 순서가 없기 때문에 인덱싱은 불가능하다.

- SET 함수는 순서가 없기 때문에 전부 값에 의한 삭제로 이루어진다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
b.add(5)
print(b)
b.update({6,7})
b.update({8,9})
b.update({10,11}) 
print(b)
 
 
b.discard(7
b.remove(6)
b.discard(7)
 
print(b)

 

- update의 경우 차례대로 마지막에 삽입이 된다.

- discard와 remove는 삭제의 개념에서는 같으나, discard의 경우 제거 할 때 해당 값이 없으면 스킵되지만,

- remove의 경우는 오류를 출력한다.

 

출력 결과

 

 

 추가 - 변수명.clear() 를 할 경우 해당 변수의 데이터 값을 초기화 시켜준다.

 

Dict ( {key:value} 의 형태를 갖고 인덱싱은 불가능합니다, key에 의해 값을 찾기 때문에 위치는 중요하지 않다. )

 

Ex 1) dict 는 다음과 같이 출력가능합니다.

 

1
2
3
4
5
mydic = dict(k1=1, k2='abc', k3=1.2)
print(mydic) 
dic = {'파이썬':'공부''자바':'열심히''스프링':'웹'}
print(dic, ' ' )
print(dic['자바'])

 

출력 결과

 

 

Ex 2) insert / delete / update 기능

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# insert 기능
dic['오라클'= '예언자'
print(dic)
 
# delete 기능
del dic['오라클']
print(dic)
 
# update 기능
dic['자바'= 'programing lan'
print(dic)
 
print(dic['자바'])
print(dic.keys()) # key 값만 출력
print(dic.values()) # values 값만 출력
 
print(dic.get('자바'))

 

출력 결과

 

반응형

'python' 카테고리의 다른 글

python - 제어문 ( if )  (0) 2020.05.07
python - 정규 표현식  (0) 2020.05.07
python - 집합형 자료 ( String , List)  (0) 2020.05.07
python - 이클립스에서 사용 & 기본 문법  (0) 2020.05.06
python - 특징 & 설치  (0) 2020.05.06
반응형

# String, List 에 대하여

 

# String : 문자열 취급 ( 순서형 )

 

1
2
3
4
5
6
7
8
9
10
11
12
13
= 'sequence'
 
# s문자열의 길이는?
print(len(s))
 
# e의 개수는?
print(s.count('e')) 
 
# 처음 e는 어디에? 3번째 이후 e는 어디에? 뒤에서부터 e는 어디에?
print(s.find('e'), ' ' , s.find('e'3), s.rfind('e')) 
 
# s 문자열에 s로 시작하면 TRUE 아니면 False
print(s.startswith('s')) 
 

변수.count('값') : 변수에서 원하는 데이터의 개수를 출력

변수.find('값') : 해당 변수에서 원하는 값이 저장된 첫 위치 출력

변수.find('값','위치') : '위치' 이후에 원하는 값이 저장된 장소 출력

변수.rfind('값') : 변수의 뒤에서부터 처음 출력되는 장소 출력

변수.startswith('값') : '값'으로 시작하면 TRUE 아니면 FALSE

 

출력 결과

 

 

Ex 2) 파이썬도 자바처럼 가비지 컬렉터가 존재하므로, 변수에 '기존 값'에서 '새로운 값'을 넣으면 덮어쓰기가 됩니다.

1
2
3
4
5
ss = 'abc'
print('abc', id(ss))
 
ss = 'def'
print('def', id(ss))

id(변수명) : '변수명'의 메모리 주소를 출력합니다.

 

출력 결과

 

 

Ex 3) # 슬라이싱 기법을 이용하면 데이터 값을 부분적으로 잘라서 볼 수 있다.

 

 
1
2
3
= 'sequence'
print(s[0], ' ' , s[2:4], ' ' , s[:3], ' ', s[3:])
print(s[-1], ' ' , s[-4:-1], ' ' , s[-4:], ' ' , s[::2])

 

변수['위치'] : '위치'번째 값 출력

변수['위치1':'위치2'] : '위치1'에서 '위치2'번째 출력

변수[ : '위치1'] : '위치1' 전까지 출력

변수[ '위치1' : ] : '위치1' 부터 전부 출력

변수[ ::'숫자' ] : 2개씩 끊어서 출력한다.

 

 - 가 붙는 경우는 반대로 생각해주면 된다 !

 

출력 결과

 

 

Ex4 ) # 문자열 데이터는 수정이 불가능합니다.

 

1
s[0= 'k'

 

Ex 5)

- split 함수는 공백 또는 특정 기준으로 나눌때 사용합니다.

- 문자열 타입의 list가 있으면 각 요소들을 하나의 문자열로 만들때 사용합니다.

1
2
3
4
ss = 'abc def'
ss2 = ss.split(sep=' ' )
print(ss2)
print(','.join(ss2))

 

출력 결과

 

 

# List 배열과 유사, 순서가 존재, 변경 가능, 여러 종류의 자료를 허용

 

Ex 1) 여러 종류의 자료를 허용합니다.

 

1
2
3
4
5
= [1,2,3]
=[10, a, 12.3, True, 'abc' ]
 
print(a, ' ', id(a))
print(b, ' ' , id(b))

 

출력 결과

 

Ex 2) 검색 , 업데이트 , 삭제하는 방법

1
2
3
4
5
6
7
8
9
10
= [1,2,3]
=[10, a, 12.3, True, 'abc' ]
 
print(b[0], ' ' , b[1], ' ' , b[1][:2]) 
b[0= 'def'
print(b[0]) 
b.remove('abc')
print(b)
del b[3]
print(b)
 

변수['숫자'] : 해당 위치의 자료 출력 

변수명.remove : 변수 안에 있는 데이터를 삭제

del 변수명 : 위와 동일하나 차이점이 있다면 del은 위치에 의한 삭제를 진행한다.

 

출력 결과

 

 

Ex 3) family 변수 사용

 

1
2
3
4
5
6
7
family = ['엄마''아빠''나']
family.append('동생'# 마지막 순서에 추가
family.remove('나'# 제거
family.insert(0'할아버지'# 원하는 순서에 맞춰서 삽입 가능
family.extend(['삼촌','고모','이모'])
family += ['아주머니''아저씨']
print(family, len(family), family[0]) # famly 변수 데이터 출력 / 길이 출력 / 0번째 출력

 

출력 결과 

 

 

Ex 4)

- 주소를 참조하기 때문에 값들을 서로 공유

- copy 함수를 import 후 deepcopy 사용하여 객체를 새로 생성 후 새로운 주소를 기억시키면 다른 값 출력

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
num = ['일','이','삼']
num2 = num
print(num)
print(num2)
 
num[0= '사'
num2[1= '오'
print(num, '  ', num2)
 
import copy
num3 = copy.deepcopy(num) # 새로운 객체 생성 후 새로운 주소를 기억
print(num, ' ',num3)
num[0= '십'
print(num, ' ' , num3)

 

출력 결과

 

 

Ex 5) stack과 queue

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
= [1,2,3]
a.append(4# 맨뒤에 4를 추가
print(a)
a.pop() # 맨 마지막에 삽입된 값은 뺌 stack과 유사
print(a)
a.pop()
print(a)
 
 
 
= [1,2,3]
b.append(4# 맨뒤에 4를 추가
print(b)
b.pop(0# 맨 마지막에 삽입된 값은 뺌 stack과 유사
print(b) # FIFO 동작과 동일함
b.pop(0)
print(b)

 

출력 결과

 

 

반응형

'python' 카테고리의 다른 글

python - 제어문 ( if )  (0) 2020.05.07
python - 정규 표현식  (0) 2020.05.07
python - 집합형 자료 ( Tuple , Set , Dict )  (0) 2020.05.07
python - 이클립스에서 사용 & 기본 문법  (0) 2020.05.06
python - 특징 & 설치  (0) 2020.05.06

+ Recent posts