Spring Boot Board Project_00 프로젝트 생성

송지윤·2024년 4월 18일
0

Spring Framework

목록 보기
31/65
post-thumbnail

1. Spring Start Project 로 새프로젝트 생성

Name, Group, Package 설정 후 Next 클릭

11개 선택 후 Finish

2. SQL 테이블 생성 및 계정 생성

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
);

3. 프로젝트 만들자마자 서버 돌리면 에러남

-> dependencies 에 사용하겠다고 추가해놓은 기능들에 대한 datasource 를 설정 안해놔서

3-1. 서버 돌리는 방법

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

Refresh Gradle Project 클릭

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

server.port=80

testImplementation 'org.springframework.security:spring-security-test'

위에 설정만 바꾸고 페이지 열었을 때 뜨는 화면

--> testImplementation 'org.springframework.security:spring-security-test'
여기서 기본 제공해주는 login 페이지
localhost/login

자동완성되는 로그인 페이지 사용 안하려면 프로젝트명.Application 클래스에 코드 추가해줘야함

@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

jsessionId 쿠키 설정

application.properties

# URL 에 jsessionId 가 보여질 때 jsessionId 를 쿠키에 담으라는 설정
server.servlet.session.tracking-modes=cookie

쿠키 / 세션

쿠키 : 클라이언트가 관리
세션 : 서버에서 관리

웹 사이트 흐름

유저가 브라우저를 통해서 서버에 요청을 보내고 서버가 돌려준 응답을 브라우저를 통해 유저에게 보여줌

유저가 브라우저를 통해서 처음으로 서버에 요청을 보낼 때 서버가 클라이언트한테 session을 하나 생성해서 발급해주는데 그 session을 식별할 수 있게끔 sessionId를 하나 만듦
그게 jsessionId

jsessionId는 쿠키에 담기는 게 정상인데 servlet container를 이용하는 spring을 이용할 때는 jsessionId가 URL 에 담김

-> 그래서 jsessionId를 쿠키에 담으라는 설정을 해주는 구문을 작성

DB 연결해서 사용 연결 준비

1. mybatis-config.xml 파일 생성

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 없을 때

복사 붙여넣기

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>
  • 첫번째 세팅 내용은 Java의 null 값을 DB의 NULL로 인식하도록 하는 설정
  • 두번째 세팅 내용은 DB의 UnderScore 표기법과 Java의 Camel 표기법이 서로 변환될 수 있도록 매핑하여 Java 클래스의 필드명과 DB 테이블의 컬럼명이 서로 연결되게 하는 설정

2. config.properties 파일 생성

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. build.gradle 에서 주석처리 해놓은 거 풀어주기

아래 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 작성해도 에러남

4. DBConfig class 생성 후 Hikari, SqlSessionFactory 설정 작성

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);
	}
	
}

주의 (src/main/resources 안에 mappers 폴더 생성해둬야함)

sessionFactoryBean.setMapperLocations(
				applicationContext.getResources("classpath:/mappers/**.xml"));

이 구문에서 classpath 에 mappers 폴더 없으면 오류남

src/main/resources 안에 mappers 폴더 생성해둬야함

전부 @Bean 어노테이션이 붙어있어야함

프로젝트 전반적으로 사용할 메세지 담아둘 messages.properties 파일 생성

properties 파일 인코딩은 UTF-8로 바꿔주고 사용

messages.properties
spring 프레임 워크 이용해서 java 기반 웹어플리케이션에서 이용하는 파일이라 파일명 틀리면 안 먹힘 (파일명이 정해져 있음)

정적 text 관리, 보통은 다국어 지원할 때 사용
각 언어별로 메세지 저장해서 관리
해당 메세지 해당 언어로 번역해서 제공

messages.properties 파일 안에 작성해둘 내용

app.name=회원제 게시판 프로젝트
user.dafault.image=/images/user.png

image 는 회원 가입 했을 때 프로필 이미지 등록 안된 상태에서 기본으로 보여줄 기본 프로필 경로
resources/static/images/user.png 에 저장해둔 사진을 기본 프로필로 보여줄 거

resources 안에 폴더 생성

static 안에 css 폴더 생성 후 main-style.css 작성

resources 안에 templates 안에 common 폴더 안에 header.html, footer.html, main.html, common.html 작성

localhost 로 들어온 요청 받아줄 Controller

MainController

@Controller
public class MainController {

	@RequestMapping("/") // "/" 최상위로 오는 요청 매핑(method 가리지 않음)
	public String mainPage() {
		// 접두사/접미사 제외한 주소 작성
		return "common/main";
	}
}

세팅 완료

0개의 댓글