일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 디자인패턴
- 도메인 주도 개발
- graphql
- nginx
- 카프카
- GCM
- notification
- nginx설치
- 푸시 번역
- 페이스북 번역
- 웹사이트 성능
- Design Pattern
- GCM 번역
- 카프카 트랜잭션
- 웹사이트최적화기법
- 웹사이트성능
- Push
- php
- 성능
- git
- 자바스크립트
- APNS
- JPA
- nginx설정
- ddd
- kafka
- gcm 푸시 번역
- 푸시
- Java
- Today
- Total
간단한 개발관련 내용
[Spring] Spring Boot 필수 설정들! 본문
Let's take a lookt at spring-boot!
한 줄로만 요약할 수는 없겠지만 굳이 이야기 한다면 '좀 더 쉽게 스프링을 관리하여 스프링을 빠르게 개발하는데 도움을 주는 도구' 이지 않을까 합니다.
A. spring-boot 를 사용하는데 있어서 핵심요소들이 있습니다.
1. @SpringBootApplication 을 통한 기본적인 Auto-Configuration 을 활성화 할 수 있습니다.
2. spring-boot 의 starter 들을 통해 이전에 비해 spring 의 설정들을 간소화 및 관련된 의존성들을 쉽게 관리할 수 있게 됬습니다.
3. spring-boot CLI(Commnand Line Interface) 를 통해서 간결한 스프링 개발 방식을 제공합니다.
4. Actuator 를 통해서 애플리케이션의 내부 작동을 살펴볼 수 있습니다.
B. 다음으로 spring-boot 애플리케이션 프로젝트를 생성하는 방법들을 확인해 보겠습니다.
1. Maven 으로 프로젝트를 생성할 수 있습니다.
mvn archetype:generate -B\
-DarchetypeGroupId=am.ik.archetype\
-DarchetypeArtifactId=spring-boot-blank-archetype\
-DarchetypeVersion=1.0.6\
-DgroupId=com.example\
-DartifactId=hajiboot\
-Dversion=1.0.0-SNAPSHOT
2. Sping Initializer의 웹 인터페이스를 사용합니다.
3. 개발도구들을 활용해서 프로젝트를 생성합니다.
- IntelliJ, SpringToolSuite
4. Spring Boot CLI 에서 Initializer 를 사용 합니다.
- spring init
- spring init -dweb,jpa,security --build gradle -p jar -x (현재디렉토리에 풀기를 원하면 --extract 나 -x 사용)
spring init -d=web,thymeleaf,data-jpa,h2 --groupId=com.example --artifactId=mylotto --name="My Lotto Service" --package-name=mylotto --description="My Lotto Service" --build maven mylotto
참고) spring-boot 의 실행.
1. mvn spring-boot:run
2. mvn package 실행 후 java -jar *.jar
참고) spring-boot-cli 설치.
1. spring-boot-cli 라이브러리를 직접 설치 및 환경설정을 한다.
2. SDKMAN(http://sdkman.io) 를 설치하여 spring-boot-cli 를 설치한다.(bashrc 가 수정되는 바람에 나중에 삭제할 때 헤맬 수 있다.)
3. Homebrew 로 설치한다.(https://brew.sh)
4. 맥포트로 설치한다.(https://www.macports.org/install.php)
C. DB
1. JDBC 연결.
a) pom.xml 에 spring-boot-starter-data-jdbc 또는 spring-boot-starter-data-jpa(jdbc를 포함) 그리고 mysql-connector 를 추가한다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<!-- jpa 안에 jdbc 포함 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
b) application.properties 에 설정값들을 추가한다.
spring.datasource.dirver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://*******:3306/my_lotto
spring.datasource.connectionProperties=useSSL=false;characterEncoding=UTF-8;zeroDateTimeBehavior=convertToNull;useAffectedRows=true
spring.datasource.username=
spring.datasource.password=
spring.datasource.initSQL=SELECT 1
spring.datasource.tomcat.max-wait=3000
spring.datasource.tomcat.mac-active=2
spring.datasource.tomcat.test-on-borrow=true
c) JdbcTemplate 으로 CRUD 를 한다.
@Autowired JdbcTemplate jdbcTemplate;
public List<MyLotto> selectList() {
String query = "SELECT * FROM mylotto ORDER BY seq desc LIMIT 10";
return jdbcTemplate.query(query, new BeanPropertyRowMapper<MyLottoVO>(MyLottoVO.class));
}
2. MyBatis 연동.
a) mybatis-spring-boot-starter 를 추가한다.(1.2.0 이 있지만... parent version 1.5.2에선 안 되는 듯)
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
b) using simple mapper
- dependency 를 추가하고, datasource에 대한 application.properties 설정이 되어 있단면 아래의 interface Mapper 만 있으면 동작한다.
@Mapper
public interface MyLottotMapper {
@Select("SELECT * FROM mylotto WHERE key = #{key}")
MyLotto selectOne(@Param("key") Integer key);
@Select("SELECT NOW() FROM DUAL")
String selectCurrentDateTime();
}
c) using SqlSession
- Dao, Repository 역할을 가지는 클래스를 만든다.
@Repository
public class MyLottoRepository {
private final SqlSession sqlsession;
public MyLottoRepository(SqlSession sqlsession) {
this. sqlsession = sqlsession;
}
public MyLotto selectOne() {
return (MyLotto) this.sqlSession.selectOne("com.joochang.lotto.selectOne");
}
}
- mapper.xml 을 만든다.
<?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.joochang.lotto">
<resultMap id="myLotto" type="com.joochang.lotto.MyLotto">
...
</resultMap>
<select id="selectOne" resultMap="myLotto">
<![CDATA[
SELECT * FROM mylotto LIMIT 1
]]>
</select>
</mapper>
3. JPA 연동.
a) JPA 를 MySql과 함께 사용하려면 먼저 아래와 같이 pom.xml 에 dependency 를 추가해 줍니다.
<!-- jpa 안에 jdbc 포함 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
b) application.properties 에 JPA와 관련된 설정을 추가합니다.
spring.jpa.databas=MYSQL
spring.jpa.show-sql=true
# 테스트할 때 유용할 것 같은 기능. #실환경에서 돌린다면 지옥을 경험한다..
# spring.jpa.hibernate.ddl-auto=create # create or create-drop
c) Entity 클래스를 생성합니다.
@Entity
public class MyLotto {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
private String name;
(생략)...
}
d) Dao, Repository 역할을 가지는 interface 를 만들어야 합니다.
public interface MyLottoJPA extends CrudRepository<MyLotto, Integer> {
MyLotto findById(Integer id);
}
또는
public interface MyLottoJPA extends JpaRepository<MyLotto, Integer> {
MyLotto findById(Integer id);
}
D. Logger
spring-boot는 모든 내부 로깅에 대해서 Commons-Loggins-API 를 사용합니다. 기본 구성은 Java-Util-Logging, Log4j2, logback 입니다. 기본적으로 spring-boot 'Starters' 를 사용하면 logback 이 사용될 것인데, Java-Util-Logging, Commons-Logging, Log4j 또는 SLF4J 를 사용하는 의존적인 라이브러리들이 모두 올바르게 동작하도록 적절한 logback 라우팅이 포함됩니다.
a) spring-boot는 콘솔에 INFO 레벨 로그를 표시하려고 로그백(http://logback.qos.ch)으로 로깅을 설정합니다. 로깅 구성을 완전히 제어하려면 클래스패스 루트(src/main/resources)에 logback.xml 파일을 생성해야 합니다. logback.xml 이 존재하면 우선적으로 파일의 내용이 적용됩니다. 다르게 하려면 logback.xml 의 이름을 변경하고 (logback-spring.xml) application.properties 에 로그설정들을 추가하면 됩니다.
참고) applcation.properties
logging.config=classpath:logback-spring.xml
logging.exception-conversion-word=
logging.file=
logging.level=
logging.path=
logging.pattern.console=
b) 만약 logback 대신 log4j2 를 사용하고 싶다면 다음과 같이 해야 합니다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
references of loggers)
- https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-logging.html
- https://docs.spring.io/spring-boot/docs/current/reference/html/howto-logging.html
E. Profile
스프링 프레임워크는 스프링 3.1부터 Profile-Based Configuration을 지원했습니다. 이것은 애플리케이션의 환경설정을 분리하는 방법이면서 특정한 환경을 구성하기도 합니다. @Component나 @Configuration 은 @Profile 과 함께 쓰여 애플리케이션의 로딩을 제한할 수 있습니다.
spring-boot를 빌드 및 실행 시 "no profiles are currently active" 라는 메시지를 마주칠 수 있는데요. 에러는 spring.profiles.active 값을 설정하면 해결할 수 있습니다. pom.xml 과 src/main/resrouce 의 application.properties 에 대한 설정을 다음과 같이 합니다.
참고) pom.xml
<properties>
<activeProfile>local</activeProfile>
</properties>
<profiles>
<profile>
<id>local</id>
<activation>
<activationByDefault>true</activationByDefault>
</activation>
<properties>
<activeProfile>local</activeProfile>
</properties>
</profile>
<profile>
<id>release</id>
<properties>
<activeProfile>release</activeProfile>
</properties>
</profile>
</profiles>
참고) application.properties
spring.profiles.active=@activeProfiles@
위와 같이 설정 후 application-{profile}.properties 형태의 입맛에 맞는 파일들을 생성하여 사용할 수 있으며, 실행은 아래와 같이 합니다.
java -jar -Dspring.profiles.active=local target/lotto-0.0.1-SNAPSHOT.jar
또는 각 서버에서 환경변수 설정을 통해 사용할 수 있습니다.
export SPRING_PROFILES_ACTIVE=release
references of profiles)
- https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-profiles.html
- https://groups.google.com/forum/#!topic/ksug/BBaO3y8hSaU
Spring-boot-profiles
- https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-profiles.html
Common-Application-Properties
- http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
Etc...
- http://www.mybatis.org/spring-boot-starter/
- https://github.com/spring-projects/spring-boot
- https://www.slideshare.net/madvirus/spring-boot-42817314
- https://www.slideshare.net/whiteship/ss-47273947