스프링부트 개발 참고 글: 1-03 스프링부트 개발 환경 준비하기 - 점프 투 스프링부트 (wikidocs.net)
스프링부트 프로젝트는
이클립스와 sts에서 생성할수있다.
이클립스에서는
이클립스 마켓플레이스에서 위 두가지를 받아주면 된다.
sts에서는 별도의 다운로드 없이 스프링부트 프로젝트를 생성할 수 있다.
이클립스에서 sts3를 다운받아
spring starter project를 생성한다.
name: 프로젝트 명이 된다.
메이븐 프로젝트를 만들기 위해 type은 메이븐으로 지정해준다.
jar로 패키징을 할것이다.
자바 버전도 지정해준다. 사용하는 jdk가 1.8이므로 8로 지정하겠다.
여기가 중요한 부분이다.
내가 개발하려는 프로젝트의 특징에 맞게 사용하고자하는 dependency들을 추가해준다.
가령 마이바티스로 개발 & db로 오라클을 사용하고자한다면
위와 같이 mybatis framework와 oracle driver를 선택해주면 된다.
이외에도 개발을 편하게 해주는 lombok와 스케줄링기능을 사용하기위해 quartz,
개발에 편한 여러기능을 제공해주는 devtools를 선택했다.
선택을 마치고 생성된 pom.xml에 들어가보면
다음과 같이 dependency가 추가된것을 확인할수있다.
오라클 사용시 필요한 ojdbc8가 자동 다운되었다.
스프링 mvc 프로젝트 생성시엔 오라클 사용을 위해선 pom.xml에
ojdbc다운로드를 위한 오라클 레포지토리 설정과 ojdbc 디펜던씨를 따로 추가해주어야 했다.
(다음과 같이)
<repositories>
<repository>
<id>oracle</id>
<name>ORACLE JDBC Repository</name>
<url>https://code.lds.org/nexus/content/groups/main-repo</url>
</repository>
</repositories>
...
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>19.7.0.0</version>
</dependency>
하지만 스프링부트 프로젝트에서는 프로젝트 생성시에 이처럼 추가하고자하는 기능을 선택만 해주면
pom.xml에 자동으로 디펜던씨가 추가된다. 스프링부트의 편한 점이다.
이외에도 추가로 jsonobject 와 jsonarray를 사용하기위한 디펜던시와 base64인코딩을 사용하기위한 commons codec 디펜던시를 추가했다 (아래참고)
<!-- JSON 사용 -->
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20160810</version>
</dependency>
<!-- base64인코딩 -->
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.15</version>
</dependency>
스프링부트 개발시 주의점
-톰캣 내장이다. 서버 추가 없이 그냥 시작해주면 된다.
-스프링mvc와 다르게 mapper 인터페이스에 @Mapper 어노테이션을 명시해주어야한다
<매퍼 인터페이스 - 서비스인터페이스 - 서비스임플 인터페이스 작성 샘플>
1. 매퍼 인터페이스
@Mapper
public interface BoardMapper {
public void insertBoard(BoardVO board);
}
2. 서비스 인터페이스
public interface BoardService {
public void insertBoard(BoardVO board);
}
서비스 인터페이스에는 매퍼인터페이스에 작성된 메서드를 그대로 옮겨준다.
3. 서비스 임플 클래스
@Service
@Transactional
public class BoardServiceImpl implements BoardService{
@Autowired
BoardMapper boardMapper;
@Override
public void insertBoard(BoardVO board) {
boardMapper.insertBoard(board);
}
}
서비스 임플 클래스에서는 해당 메서드를 재정의해준다.
실제로 호출되는 서비스가 이부분이라고 생각해주면된다 (따라서 서비스 임플 클래스에 @Service를 붙여준다.)
해당 메서드는 매퍼인터페이스의 메서드를 호출한다.
매퍼인터페이스의 매서드는 실제 sql 쿼리와 연결되는 메서드다.
즉 실제 호출하는 서비스가 실제 쿼리와 연결된 메서드를 호출하는 구조여야한다.
서비스 임플 클래스에서는 실제 쿼리와 연결된 메서드가 있는 매퍼 인터페이스의 메서드를 명시해주므로
매퍼인터페이스 사용을 위해 매퍼인터페이스를 autowired로 주입해주고있다.
기본적으로 프로젝트 구조는 다음과 같이 작성하면 된다.
dao 하위에 mapper 인터페이스를 넣어준다
service 하위에 service인터페이스와 serviceimpl 클래스를 넣어준다.
만약,
서비스-서비스 임플 두가지의 구조로만 작성한다면
이때 매퍼 인터페이스의 역할을 서비스 인터페이스가 하게될것이다.
따라서 서비스 인터페이스에 @Mapper 를 붙여준다.
그리고 서비스인터페이스에 작성될 메서드들은
매퍼.xml의 쿼리와 연결되어야할것이다.
따라서 매퍼.xml에서 네임스페이스의 경로는 서비스 인터페이스의 경로가 될것이다.
매퍼.xml의 네임스페이스 경로=@Mapper가 붙어야하는 인터페이스
이 규칙만 지켜지면 된다.
가령,
매퍼.xml에서
select * from 테이블 where~
같은 쿼리가 있고 이는 vo타입으로 반환된다고 해보자.
그럼 매퍼 인터페이스를 생략한 서비스인터페이스-서비스 임플 클래스의 구조는 다음처럼 작성되어야한다.
서비스 인터페이스에는 @Mapper가 붙고 여기에는 간단한 메서드 명만 작성된다.
서비스 임플 클래스는 말그대로 이를 구현해주는 클래스다.
따라서 메서드와 그 내용으로 vo타입이 리턴되어야한다.
//mapper.xml
//네임스페이스는 이와 연결되는 인터페이스 경로를 작성해주면 된다(@Mapper가 붙는 인터페이스)
//STATUS_TABLE에서 TASK = 'A'인 task의 STATUS라는 컬럼값을 선택해 StatusVO에 담아 반환한다.
<mapper namespace="com.sample.service.SampleService">
<select id="getStatus" resultType="com.sample.vo.StatusVO">
SELECT
STATUS
FROM STATUS_TABLE
WHERE TASK = 'A'
</select>
</mapper>
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
//SampleService 라는 이름의 서비스 인터페이스
//Mapper.xml과 연결되는 실제 매퍼이기 때문에 @Mapper를 붙여준다.
@Mapper
public interface SampleService {
//StatusVO에 담아 status를 가져온다.
public StatusVO getStatus();
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
//SampleService의 메서드를 구현해주는 SampleService 임플 클래스.
//여기에 @Service를 붙여준다.
//service에서는 메서드만 명시해줬는데 실제 이 메서드가 vo타입으로 리턴되기 때문에
//여기에서 그부분을 정의해준다. 따라서 쿼리에 의해 셀렉된 값을 해당 메서드 호출을 통해
//vo로 리턴받기 위해 return new StatusVO를 해준다.
@Service
public class SampleServiceImpl implements SampleService{
public StatusVO getStatus() {
//return Service.getStatus(); //에러
return new StatusVO();
}
}
주의) 서비스 임플에서 메서드 구현시 다시 service인터페이스의 해당 메서드로 리턴시키면 루프를 돌게되니 이처럼 작성하지 않도록 주의한다.
서비스임플에서 @Mapper가 붙은 인터페이스의 메서드로 다시 리턴시키는 방식은
매퍼인터페이스-서비스인터페이스-서비스 임플같이 세가지에 걸쳐 작성되었을때 사용하는 것이고,
위와같이 서비스인터페이스가 매퍼인터페이스의 역할을 할 때는 서비스임플 클래스에서 서비스인터페이스의 메서드를 호출하게되면 서비스임플이 서비스인터페이스를 호출하고 서비스인터페이스는 다시 서비스임플에서 구현되어 stackoverflow에러가 나게된다.
<application.properties 작성>
#oracle
spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@localhost:1521:orcl
spring.datasource.username=xxxx
spring.datasource.password=xxxx
#Mybatis
mybatis.mapper-locations=mapper/**/*.xml
mybatis.type-aliases-package=com.example.vo
오라클 db 연결 설정은 위와같이하면된다.
스프링부트 마이바티스 사용시에는
매퍼 경로를 mybatis.mapper-locations에 명시해주면 된다.
기본적으로 src/main/resource 밑에 mapper.xml 파일을 넣어준다.
만약 위와 같이 src/main/resource하위에 mapper라는 폴더를 만들고
그 안에 mapper.xml을 넣어준다면
mybatis.mapper-locations 경로는 mapper/**/*.xml 라고 작성되어야한다.
src/main/resource 이하의 경로만 써주면 된다.
mapper 폴더 하위에 추가로 폴더가 생성되고 그 안에xml 파일이 들어가는 경우를 생각해서
mapper/**/*.xml 라고 작성해주는것이다.
(그렇게 하지 않고 mapper폴더 아래에 모든 mapper.xml 파일이 들어가게된다면 mapper/*.xml이라고 적어도 된다)
mybatis.type-aliases-package 은 mapper.xml에서 쿼리문 작성시 resultType이나 parametertype 명시 시,
vo등의 경로를 작성해줘야하는데
가령 com.example.vo 패키지 아래에 SampleVO.java 라는 vo 클래스가 들어있고 이를 resultType에 명시해줘야한다면
resultType = com.example.vo.SampleVO
라고 적어줘야한다.
하지만 쿼리문이 많아지면 vo의 경로를 이처럼 풀로 적기 귀찮아질수있다 (오타가 발생할수도있다)
따라서 vo경로의 패키지명을 생략하고 vo 클래스명만 resultType에 적을 수 있게 해주는 것이
mybatis.type-aliases-package 이다.
여기에 vo가 들어있는 패키지 명을
mybatis.type-aliases-package =com.example.vo
다음과같이 적어주면 패키지명을 생략하고 매퍼.xml에서 resultType등 작성시
resultType = SampleVO
라고 간략하게 적어줄수있다.
만약 vo가 들어있는 패키지 명이
com.example.a.vo
com.example.b.vo 등 여러개라면
mybatis.type-aliases-package = com.example.*.vo
라고 명시해주면 된다.
'etc > Spring' 카테고리의 다른 글
springboot에서 DB연결 테스트 (0) | 2022.10.27 |
---|---|
springboot jar파일 실행시 로그 파일 남기기 (0) | 2022.10.27 |
[Spring Boot]Duplicating managed version ~ for ~ (0) | 2022.10.11 |
@alias 어노테이션 (0) | 2022.07.18 |
[이클립스] Spring MVC 프로젝트 생성 (0) | 2022.06.02 |