

Name, Group, Package 설정 후 Next 클릭

11개 선택 후 Finish
MEMBER 테이블 생성
CREATE TABLE "MEMBER"(
"MEMBER_NO" NUMBER CONSTRAINT "MEMBER_PK" PRIMARY KEY,
"MEMBER_EMAIL" NVARCHAR2(50) NOT NULL,
"MEMBER_PW" NVARCHAR2(100) NOT NULL,
"MEMBER_NICKNAME" NVARCHAR2(10) NOT NULL,
"MEMBER_TEL" CHAR(11) NOT NULL,
"MEMBER_ADDRESS" NVARCHAR2(150),
"PROFILE_IMG" VARCHAR2(300),
"ENROLL_DATE" DATE DEFAULT SYSDATE NOT NULL,
"MEMBER_DEL_FL" CHAR(1) DEFAULT 'N'
CHECK("MEMBER_DEL_FL" IN ('Y', 'N') ),
"AUTHORITY" NUMBER DEFAULT 1
CHECK("AUTHORITY" IN (1, 2) )
);
시퀀스 생성
CREATE SEQUENCE SEQ_MEMBER_NO NOCACHE;
테스트용 샘플 추가
INSERT INTO "MEMBER"
VALUES(SEQ_MEMBER_NO.NEXTVAL,
'user01@kh.or.kr',
'pass01!',
'유저일',
'01012341234',
NULL,
NULL,
DEFAULT,
DEFAULT,
DEFAULT
);
-> dependencies 에 사용하겠다고 추가해놓은 기능들에 대한 datasource 를 설정 안해놔서

db에 관련된 것들 주석처리 해주고 저장 후

Refresh Gradle Project 클릭
application.properties 에서 포트 번호 80 으로 바꿔서 localhost 만 쳐도 웹 페이지 들어갈 수 있게 설정
(문자 UTF-8 저장)
server.port=80

위에 설정만 바꾸고 페이지 열었을 때 뜨는 화면
--> testImplementation 'org.springframework.security:spring-security-test'
여기서 기본 제공해주는 login 페이지
localhost/login
@SpringBootApplication 어노테이션 옆에 (exclude= {SecurityAutoConfiguration.class}) 코드 추가
Spring Security 에서 기본 제공하는 로그인 페이지 이용 안하겠다는 코드
package com.home.project;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
@SpringBootApplication(exclude= {SecurityAutoConfiguration.class})
public class BoardProjectHomeApplication {
public static void main(String[] args) {
SpringApplication.run(BoardProjectHomeApplication.class, args);
}
}
이 코드 작성하고 다시 서버 돌리면 Whitelabel Error Page 뜸

현재 메인 페이지를 만든 게 없기 때문에
application.properties
-> 프로젝트 전반적 설정
spring.application.name=boardProject-home
# 서버 포트 번호 80 으로 변경
server.port=80
# Spring devTools 관련 설정
spring.devtools.livereload.enabled=true
spring.devtools.restart.enabled=true
spring.thymeleaf.cache=false
# 로깅 레벨 지정
logging.level.com.home.project=debug
application.properties
# URL 에 jsessionId 가 보여질 때 jsessionId 를 쿠키에 담으라는 설정
server.servlet.session.tracking-modes=cookie
쿠키 : 클라이언트가 관리
세션 : 서버에서 관리
유저가 브라우저를 통해서 서버에 요청을 보내고 서버가 돌려준 응답을 브라우저를 통해 유저에게 보여줌
유저가 브라우저를 통해서 처음으로 서버에 요청을 보낼 때 서버가 클라이언트한테 session을 하나 생성해서 발급해주는데 그 session을 식별할 수 있게끔 sessionId를 하나 만듦
그게 jsessionId
jsessionId는 쿠키에 담기는 게 정상인데 servlet container를 이용하는 spring을 이용할 때는 jsessionId가 URL 에 담김
-> 그래서 jsessionId를 쿠키에 담으라는 설정을 해주는 구문을 작성
src/main/resources
xml 폴더 만들 때 new xml file 누르고 파일명 작성 한 다음 next 클릭
Create file using a DTD or XML Schema file 클릭하고 next
Select XML Catalog entry 클릭 후
User Specified Entries 에서 DTD Config 선택 후 Finish
catalog entry 없을 때
Config
Location : http://mybatis.org/dtd/mybatis-3-config.dtd
Key type : Public ID
Key : -//mybatis.org//DTD Config 3.0//EN
Mapper
Location : http://mybatis.org/dtd/mybatis-3-mapper.dtd
Key type : Public ID
Key : -//mybatis.org//DTD Mapper 3.0//EN
복사 붙여넣기
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>
<settings>
<setting name="jdbcTypeForNull" value="NULL"/>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
</configuration>
src/main/resources
config.properties
# 오라클 DB 연결 정보
spring.datasource.hikari.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.datasource.hikari.jdbc-url=jdbc:oracle:thin:@localhost:1521:XE
spring.datasource.hikari.username=계정명
spring.datasource.hikari.password=비밀번호
# HikariCP Connection Pool Properties
# 풀이 연결을 사용할 수 있을 때까지 대기하는 최대 시간(ms)을 지정
spring.datasource.hikari.connection-timeout=30000
# 풀의 최대 연결 수 설정
spring.datasource.hikari.maximum-pool-size=50
# 연결이 풀에서 유휴 상태로 있을 수 있는 최대 시간(ms)을 지정
spring.datasource.hikari.idle-timeout=600000
# 연결 풀의 이름을 지정
spring.datasource.hikari.pool-name=MyHikariCP
# 자동 커밋 끄기
spring.datasource.hikari.auto-commit=false
나중에 설정이 더 추가될 거 (중요 정보)
아래 3개
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.3'
runtimeOnly 'com.oracle.database.jdbc:ojdbc11'
저장 후 refresh gradle project
안하면 DBConfig 작성해도 에러남
src/test/java
common.config
DBConfig
package com.home.project.common.config;
import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
@Configuration
@PropertySource("classpath:/config.properties")
public class DBConfig {
/* @Configuration
* - 설정용 클래스임을 명시
* - 객체로 생성해서 내부 코드를 서버 실행시 모두 수행
*
* @PropertySource("경로")
* - 지정된 경로의 properties 파일 내용을 읽어와 사용
* - 사용할 properties 파일이 다수일 경우 해당 어노테이션을 연속해서 작성
*
* 경로 안에 들어있는 classpath == src/main/resources
* */
private final ApplicationContext applicationContext;
@Bean
@ConfigurationProperties(prefix="spring.datasource.hikari")
public HikariConfig hikariConfig() {
/* @ConfigurationProperties 는 @PropertySource 와 연결해서 사용됨
* @ConfigurationProperties(prefix="spring.datasource.hikari")
* - @PropertySource 로 읽어온 properties 파일의 내용 중
* 접두사(prefix)가 일치하는 값만 읽어오겠다.
*
* config.properties 파일에서 접두사가 spring.datasource.hikari로 시작하는 구문을
* 읽어오겠다.
* */
return new HikariConfig();
}
@Bean
public DataSource dataSource(HikariConfig config) {
DataSource dataSource = new HikariDataSource(config);
/* import com.zaxxer.hikari.HikariConfig;
* import com.zaxxer.hikari.HikariDataSource;
*
* DataSource
* Connection 생성 + Connection Pool 지원하는 객체를
* 참조하기 위한 Java 인터페이스
* */
return dataSource;
}
@Bean
public SqlSessionFactory sessionFactory(DataSource dataSource) throws Exception {
SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
sessionFactoryBean.setDataSource(dataSource);
sessionFactoryBean.setMapperLocations(
applicationContext.getResources("classpath:/mappers/**.xml"));
sessionFactoryBean.setTypeAliasesPackage("com.home.project");
sessionFactoryBean.setConfigLocation(
applicationContext.getResource("classpath:/mybatis-config.xml"));
// 설정 내용이 모두 적용된 객체 반환
return sessionFactoryBean.getObject();
}
@Bean
public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sessionFactory) {
return new SqlSessionTemplate(sessionFactory);
}
@Bean
public DataSourceTransactionManager dataSourceTransactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
sessionFactoryBean.setMapperLocations(
applicationContext.getResources("classpath:/mappers/**.xml"));
이 구문에서 classpath 에 mappers 폴더 없으면 오류남
src/main/resources 안에 mappers 폴더 생성해둬야함
properties 파일 인코딩은 UTF-8로 바꿔주고 사용
messages.properties
spring 프레임 워크 이용해서 java 기반 웹어플리케이션에서 이용하는 파일이라 파일명 틀리면 안 먹힘 (파일명이 정해져 있음)
정적 text 관리, 보통은 다국어 지원할 때 사용
각 언어별로 메세지 저장해서 관리
해당 메세지 해당 언어로 번역해서 제공
messages.properties 파일 안에 작성해둘 내용
app.name=회원제 게시판 프로젝트
user.dafault.image=/images/user.png
image 는 회원 가입 했을 때 프로필 이미지 등록 안된 상태에서 기본으로 보여줄 기본 프로필 경로
resources/static/images/user.png 에 저장해둔 사진을 기본 프로필로 보여줄 거
static 안에 css 폴더 생성 후 main-style.css 작성
resources 안에 templates 안에 common 폴더 안에 header.html, footer.html, main.html, common.html 작성
MainController
@Controller
public class MainController {
@RequestMapping("/") // "/" 최상위로 오는 요청 매핑(method 가리지 않음)
public String mainPage() {
// 접두사/접미사 제외한 주소 작성
return "common/main";
}
}

세팅 완료