Study Web Development

3월 17일

이전으로

Spring Boot

프로젝트 설정

  1. src/main/resources에서 application.properteis에 다음의 내용을 추가
# tomcat port setting
server.port=8081

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

# Datasource setting
spring.datasource.hikari.driver-class-name=oracle.jdbc.OracleDriver
spring.datasource.hikari.jdbc-url=jdbc:oracle:thin:@localhost:1521:xe
spring.datasource.hikari.username=scott
spring.datasource.hikari.password=tiger
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
# 클라이언트가 pool에 connection을 요청하는 데 기다리는 최대 시간을 30초로 설정
spring.datasource.hikari.connection-timeout=30000
# 유휴 및 사용 중인 connection을 포함하여 pool에 보관하는 최대 커넥션 개수를 설정
spring.datasource.hikari.maximum-pool-size=20

# 메시지 파일 지정
spring.messages.basename=messages.validation

# JSP reload
spring.devtools.livereload.enabled=true

# MyBatis setting
mybatis.mapper-locations=classpath:mybatis/mapper/**/*.xml
mybatis.type-aliases-package=kr.spring.**.vo
  1. src/main/java에 새 패키지 kr.spring.config 생성하고 새 클래스 AppConfig 생성
package kr.spring.config;

import javax.sql.DataSource;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

@Configuration
public class AppConfig {
	@Bean
	/*
	 * *.properties, *.yml 파일에 있는 property를 자바 클래스에 값을 가져와서 사용할 수 있도록 처리
	 */
	@ConfigurationProperties(prefix="spring.datasource.hikari")
	public HikariConfig hikariConfig() {
		return new HikariConfig();
	}
	
	@Bean
	public DataSource dataSource() {
		DataSource dataSource = new HikariDataSource(hikariConfig());
		return dataSource;
	}
}
  1. src/main 폴더 오른쪽 클릭하고 하위 폴더로 webapp 생성 후 하위 폴더로 WEB-INF 생성
  2. C:\javaWork\workspace_spring\ch07MybatisAnnot\src\main\webapp\WEB-INF에서 views 폴더를 복사하여 현재 프로젝트에 붙여넣기
  3. src/main/resources 폴더 오른쪽 클릭하고 새 폴더 messages 생성 후 새 파일 validation.properties 생성
NotEmpty.name=이름은 필수 항목
NotEmpty.title=제목은 필수 항목
NotEmpty.passwd=비밀번호는 필수 항목
NotEmpty.content=내용은 필수 항목
invalidPassword=비밀번호 불일치
  1. src/main/resources/static 폴더 오른쪽 클릭하고 새 폴더 css 생성
  2. C:\javaWork\workspace_spring\ch07MybatisAnnot\src\main\webapp\resources\css에서 style.css 파일을 복사하여 현재 프로젝트에 붙여넣기
  3. views 폴더 내 모든 JSP 파일에서 <link> 태그의 경로를 다음처럼 수정
<link rel="stylesheet" href="${pageContext.request.contextPath}/css/style.css">
  1. 새 패키지 kr.spring.util 생성
  2. C:\javaWork\workspace_spring\ch07MybatisAnnot\src\main\java\kr\spring\util에서 PagingUtil.java 파일을 복사하여 붙여넣기
  3. application.properties 파일의 확장자에 _를 붙여 설정 파일로 인식되지 않도록 처리
    • .properties.yml이 모두 있는 경우 둘 다 인식하지만, 같은 항목에 값이 다른 경우 문제가 발생할 수 있음
  4. src/main/resources 폴더 오른쪽 클릭하고 application.yml 생성
spring:
  mvc:
    view:
      prefix: /WEB-INF/views/
      suffix: .jsp

  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    hikari:
      driver-class-name: oracle.jdbc.OracleDriver
      jdbc-url: jdbc:oracle:thin:@localhost:1521:xe
      username: scott
      password: tiger
      connection-timeout: 30000
      maximum-pool-size: 20

  messages:
    basename: messages.validation
    encoding: UTF-8

  devtools:
    livereload:
      enabled: true

mybatis:
  type-aliases-package: kr.spring.**.vo
  mapper-locations: mybatis/mapper/**/*.xml

server:
  port: 8081

VO

  1. 새 패키지 kr.spring.vo 생성하고 BoardVO 생성
package kr.spring.board.vo;

import java.sql.Date;

import javax.validation.constraints.NotEmpty;

public class BoardVO {
	private int num;
	@NotEmpty
	private String name;
	@NotEmpty
	private String title;
	@NotEmpty
	private String passwd;
	@NotEmpty
	private String content;
	private Date reg_date;
	
	public int getNum() {
		return num;
	}
	public void setNum(int num) {
		this.num = num;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getPasswd() {
		return passwd;
	}
	public void setPasswd(String passwd) {
		this.passwd = passwd;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
	public Date getReg_date() {
		return reg_date;
	}
	public void setReg_date(Date reg_date) {
		this.reg_date = reg_date;
	}
}

DAO

  1. 새 패키지 kr.spring.board.dao 생성하고 새 인터페이스 BoardMapper 생성
package kr.spring.board.dao;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import kr.spring.board.vo.BoardVO;

@Mapper // @Mapper 어노테이션이 있어야 구현되는 객체를 서비스에서 인식 가능
public interface BoardMapper {
	public void insertBoard(BoardVO board);
	@Select("SELECT COUNT(*) FROM tboard")
	public int getBoardCount();
	public List<BoardVO> getBoardList(Map<String, Object> map);
	@Select("SELECT * FROM tboard WHERE num=#{num}")
	public BoardVO getBoard(int num);
	@Update("UPDATE tboard SET name=#{name}, title=#{title}, content=#{content} WHERE num=#{num}")
	public void updateBoard(BoardVO board);
	@Delete("DELETE FROM tboard WHERE num=#{num}")
	public void deleteBoard(int num);
}
  1. src/main/resources 폴더 오른쪽 클릭하고 새 폴더 mybatis 생성 후 하위 폴더로 mapper 생성
  2. C:\javaWork\workspace_spring\ch07MybatisAnnot\src\main\java\kr\spring\board\dao에서 BoardMapper.xml 파일을 복사하여 붙여넣기

Service

  1. 새 패키지 kr.spring.board.service 생성하고 새 인터페이스 BoardService 생성
package kr.spring.board.service;

import java.util.List;
import java.util.Map;

import kr.spring.board.vo.BoardVO;

public interface BoardService {
	public void insertBoard(BoardVO board);
	public int getBoardCount();
	public List<BoardVO> getBoardList(Map<String, Object> map);
	public BoardVO getBoard(int num);
	public void updateBoard(BoardVO board);
	public void deleteBoard(int num);
}
  1. 새 클래스 BoardServiceImpl 생성
package kr.spring.board.service;

import java.util.List;
import java.util.Map;

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

import kr.spring.board.dao.BoardMapper;
import kr.spring.board.vo.BoardVO;

@Service
@Transactional
public class BoardServiceImpl implements BoardService {
	@Autowired
	private BoardMapper boardMapper;

	@Override
	public void insertBoard(BoardVO board) {
		boardMapper.insertBoard(board);
	}

	@Override
	public int getBoardCount() {
		return boardMapper.getBoardCount();
	}

	@Override
	public List<BoardVO> getBoardList(Map<String, Object> map) {
		return boardMapper.getBoardList(map);
	}

	@Override
	public BoardVO getBoard(int num) {
		return boardMapper.getBoard(num);
	}

	@Override
	public void updateBoard(BoardVO board) {
		boardMapper.updateBoard(board);
	}

	@Override
	public void deleteBoard(int num) {
		boardMapper.deleteBoard(num);
	}
}

Controller

  1. 새 패키지 kr.spring.board.controller 생성
  2. C:\javaWork\workspace_spring\ch07MybatisAnnot\src\main\java\kr\spring\board\controller에서 BoardController.java 파일을 복사하여 붙여넣기
  3. BoardController 클래스에 다음의 메서드를 추가
	@RequestMapping("/")
	public String main() {
		return "redirect:/list.do";
	}

Python

1. 파이썬이란 무엇인가

1-2 파이썬의 특징

1-4 설치 및 개발환경

https://www.python.org/downloads

  1. Add Python 3.10 to PATH 선택하고 Install Now 선택
  2. C:/javaWork에 새 폴더 workspace_python 생성
  3. 이클립스에서 File-Switch Workspace-Other... 선택 후 C:\javaWork\workspace_python 선택
  4. Help-Eclipse Marketplace...에서 python 검색 후 PyDev를 설치
  5. Window-Preferences-PyDev-Interpreters-Python Interpreters에서 New...-Config first in PATH 선택
    • 사용자 환경 변수에 3.10, 3.8 순서로 등록되어 있고 시스템 환경 변수에 3.8이 등록되어 있으면 3.8로 인식되므로, 시스템 환경 변수에 3.10을 3.8보다 빠른 순서로 등록하고 이클립스 재시작

1-5 기본 사용

  1. New-Other-PyDev-PyDev Project 선택하고 프로젝트명에 ch01-basic 입력 후 Finish
  2. Preferences-General-Workspace에서 Text file endcoding을 UTF-8로 지정
  3. 새 파일 s01_print.py 생성
# 출력하기
# 주석 : #은 한 줄 주석, """와 '''는 주석
"""
여러 줄
주석
"""
'''
여러 줄
주석
'''
# 문자열 출력
print("Hello World"); # 출력 후 줄바꿈
print('오늘은 목요일') # 파이썬에서는 일반적으로 세미콜론을 생략하며, 문자와 문자열을 구별하지 않고 '와 "를 모두 사용 가능
# 정수 출력
print(35)
# 실수 출력
print(5.75)
# 논리 데이터 출력
print(True)
print(False)

2. 변수

  1. 새 파일 s02_variable.py 생성
# 변수의 사용
a = 1
b = 2
print(a,b) # 줄바꿈하지 않고 공백을 구분자로 하여 변수 2개를 한 줄에 출력
print('---')

# 연산
print(a+b)
print('---')

# 문자열 + 문자열 = 문자열
print('대한' + '민국')
print('---')

# 숫자 + 문자열은 오류 발생
# print(5 + '10')

# 숫자를 문자열로 변환
print(str(5) + '10')
print('---')
  1. 새 파일 s03_variable2.py 생성
# 변수명은 대소문자를 구분하고 숫자로 시작 불가
# 특수문자와 공백은 변수명에 사용할 수 없음
friend = 5
Friend = 6
print(friend,Friend)
print('---')

# 출력시 공백이 아닌 다른 문자를 구분자로 사용하고 싶은 경우 sep 인수에 원하는 문자를 지정
print(friend,Friend,sep=",")

s = '서울'
i = '인천'
j = '전주'
b = '부산'

# 출력시 끝 문자로 개행 문자 외에 다른 문자를 사용하고 싶은 경우 end 인수에 원하는 문자를 지정
# print(출력 내용 [,sep=구분자] [,end=끝 문자])
print(s,i,j,b,sep='-->',end='^^')
print('---')

다음으로