728x90

pom.xml

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.21</version>
</dependency>

Druid는 기본적으로 spring.datasource.druid 접두사를 사용한다.

application.properties

spring.datasource.druid.url=jdbc:mysql://localhost:3306/test
spring.datasource.druid.username=root
spring.datasource.druid.password=
spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver
# connection pool
spring.datasource.druid.initialSize=10
spring.datasource.druid.maxActive=20
spring.datasource.druid.maxWait=60000
spring.datasource.druid.minIdle=1
spring.datasource.druid.timeBetweenEvictionRunsMillis=60000
spring.datasource.druid.minEvictableIdleTimeMillis=300000
spring.datasource.druid.testWhileIdle=true
spring.datasource.druid.testOnBorrow=true
spring.datasource.druid.testOnReturn=false
spring.datasource.druid.poolPreparedStatements=true
spring.datasource.druid.maxOpenPreparedStatements=20
spring.datasource.druid.validationQuery=SELECT 1
spring.datasource.druid.validation-query-timeout=500
spring.datasource.druid.filters=stat

혹은 yml 파일일시

spring:
    datasource:
        druid:
            driver-class-name: com.mysql.cj.jdbc.Driver
            filters: stat
            initialSize: 10
            maxActive: 20
            maxOpenPreparedStatements: 20
            maxWait: 60000
            minEvictableIdleTimeMillis: 300000
            minIdle: 1
            password: ''
            poolPreparedStatements: true
            testOnBorrow: true
            testOnReturn: false
            testWhileIdle: true
            timeBetweenEvictionRunsMillis: 60000
            url: jdbc:mysql://localhost:3306/test
            username: root
            validation-query-timeout: 500
            validationQuery: SELECT 1

Druid 모니터링 라이브러리 적용

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

application.properties 값 추가

spring.datasource.druid.stat-view-servlet.enabled=true          # 
spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*  # address 규칙
spring.datasource.druid.stat-view-servlet.reset-enable=true     # 통계데이터 리셋여부
spring.datasource.druid.stat-view-servlet.login-username=admin  # 모니터링 화면로그인 계정
spring.datasource.druid.stat-view-servlet.login-password=admin  # 모니터링 화면로그인 비번

UserService 클래스를 호출할 controller 를 작성

@Data
@AllArgsConstructor
@RestController
public class UserController {

    private UserService userService;

    @PostMapping("/user")
    public int create(@RequestBody User user) {
        return userService.create(user.getName(), user.getAge());
    }

    @GetMapping("/user/{name}")
    public List<User> getByName(@PathVariable String name) {
        return userService.getByName(name);
    }

    @DeleteMapping("/user/{name}")
    public int deleteByName(@PathVariable String name) {
        return userService.deleteByName(name);
    }

    @GetMapping("/user/count")
    public int getAllUsers() {
        return userService.getAllUsers();
    }

    @DeleteMapping("/user/all")
    public int deleteAllUsers() {
        return userService.deleteAllUsers();
    }

}

아래 주소 입력 http://localhost:8080/druid/

'Springboot2.x 강좌 > DB연결' 카테고리의 다른 글

XML 로 Mybatis 설정하기  (0) 2023.01.05
Mybatis 로 Mysql 연결하기  (0) 2023.01.05
Spring Data JPA  (0) 2023.01.05
Hikari 설정  (0) 2023.01.04
JdbcTemplate 로 db 접근해보자  (0) 2023.01.04
728x90

현재 springboot은 기본으로 .yml 을 우선시한다. 하지만 가끔씩 아날로그식? .properties 구석 과 xml 구성으로 값을 가져와 써야 할때가 종종 있다. 그럼 어떻게 사용할까?

poml.xm 추가

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-configuration-processor</artifactId>
     <optional>true</optional>
 </dependency>

application.properties

author.name=samsung
author.age=20

설정클래스 상단에 @PropertySource("classpath:your.properties")을 사용하면 yml 구성을 로딩한것과 같은 효과다.

@Component
@PropertySource(value = {"classpath:static/config/authorSetting.properties"},
        ignoreResourceNotFound = false, encoding = "UTF-8", name = "authorSetting.properties")
public class AuthorTest {
 
    @Value("${author.name}")
    private String name;
    @Value("${author.age}")
    private int age;
}
@PropertySource 의 속성 요약 1.value:설정파일 경로. 2.ignoreResourceNotFound:지정파일 존재하지 않을시 에러! 기본옵션 false 이다.true 설정해야 파일 없으면 오류. 실제 개발시 ignoreResourceNotFound 를 false로 설정한다. 3.encoding:파일 읽어드릴시 UTF-8 인코딩.
 
@Value 사용이 좀 많을때 등장한것이 바로 @ConfigurationProperties 옵션이다.
@Component
@ConfigurationProperties(prefix = "author")
@PropertySource(value = {"classpath:static/config/authorSetting.properties"},
        ignoreResourceNotFound = false, encoding = "UTF-8", name = "authorSetting.properties")
public class AuthorTest {
 
    private String name;
    private int age;
 
}
@RestController
@EnableConfigurationProperties
public class DemoController {
 
    @Autowired
    AuthorTest authorTest;
 
    @RequestMapping("/")
    public String index(){
        return "author's name is " + authorTest.getName() + ",ahtuor's age is " + authorTest.getAge();
    }
}

마지막으로!

@ConfigurationProperties 사용하기위 위해서는 꼭 @EnableConfigurationProperties 를 써서 활성화 한다.

 

끝!

 

728x90

springboot1.x 시절에는 JDBC 가 기본옵션이였지만 성능문제가 많아서 springboot 2.x 대부터는 기본적으Hikari 풀을 사용한다고 한다. 뇌피셜?

application.propertises

spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.hikari.minimum-idle=10
spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.idle-timeout=500000
spring.datasource.hikari.max-lifetime=540000
spring.datasource.hikari.connection-timeout=60000
spring.datasource.hikari.connection-test-query=SELECT 1

혹은 application.yml

spring:
    datasource:
        driver-class-name: com.mysql.jdbc.Driver
        hikari:
            connection-test-query: SELECT 1
            connection-timeout: 60000
            idle-timeout: 500000
            max-lifetime: 540000
            maximum-pool-size: 20
            minimum-idle: 10
        password: 123456
        url: jdbc:mysql://localhost:3306/test
        username: root
  • spring.datasource.hikari.minimum-idle : pool에서 관리하는 최소 유휴 connection의 수에 관한 설정이다. 기본값으로 maximumPoolSize와 같은 값을 가진다.
  • spring.datasource.hikari.maximum-pool-size : 유휴한 connection과 사용중인 connection을 포함하여 pool의 크기를 설정하는 것이다. 기본값으로는 10을 가진다.
  • spring.datasource.hikari.max-lifetime : connection의 최대 유지시간에 관한 설정이다. 이 시간이 지난 connection 중에서 사용중인 connection은 connection이 종료된 이후에 pool에서 제거가 된다. 기본값으로는 1800000ms(30분)를 가지고, 0으로 설정하게 되면 무한 수명을 의미한다.
  • spring.datasource.hikari.connection-timeout : 클라이언트가 pool의 connection을 기다리는 최 대 시간(밀리초, ms)에 관한 설정으로, 기본값은 30000ms(30초)이고, 최소값은 250ms이다. 또한 만일 최대 시간을 넘으면 SQL Exception이 발생한다.
     
  • spring.datasource.hikari.connection-test-query : 데이터베이스 연결이 여전히 활성화되어있는지 확인하기 위해 pool에서 connection을 제공하기 전에 실행되는 쿼리입니다. 드라이버가 JDBC4를 지원하는 경우 이 속성을 사용하지 않는 것이 좋다고함.

 

참고바라며

끝!

'Springboot2.x 강좌 > DB연결' 카테고리의 다른 글

XML 로 Mybatis 설정하기  (0) 2023.01.05
Mybatis 로 Mysql 연결하기  (0) 2023.01.05
Spring Data JPA  (0) 2023.01.05
Druid datasource 연결  (0) 2023.01.05
JdbcTemplate 로 db 접근해보자  (0) 2023.01.04
728x90

pom.xml 추가

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

내장 db 는 로컬에서 잠깐 테스트 하기 좋으나 실제 운영에서는 거의 사용하지 않는다. 그럼 HSQL 를 사용해보자.

<dependency>
    <groupId>org.hsqldb</groupId>
    <artifactId>hsqldb</artifactId>
    <scope>runtime</scope>
</dependency>

혹은 mysql를 사용하는것도 좋다.

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

src/main/resources/application.properties 를 아래와 같이 세팅해보자. 물론 앞서 배운 .yml 파일을 적용해도 무방하다.

application.properties 설정

spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=dbuser
spring.datasource.password=dbpass
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

또는 application.yml 설정

datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    password: dbpass
    url: jdbc:mysql://localhost:3306/test
    username: dbuser

주의! Spring2.1.x 부터는 기본으로 mysql 8.0 드라이버로 변경되었다. 그래서 구버전인 com.mysql.jdbc.Driver 사용하지 말고 com.mysql.cj.jdbc.Driver를 사용한다.

spring.datasource.jndi-name=java:jboss/datasources/customers

DB 생성 후 테이블 생성!

CREATE TABLE `User` (
  `name` varchar(100) COLLATE utf8mb4_general_ci NOT NULL,
  `age` int NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci

User 객체를 만든다.

@Data
@NoArgsConstructor
public class User {

    private String name;
    private Integer age;

}

db 액세서 interface를 정의.

public interface UserService {

    /**
     * 사용자 추가 
     *
     * @param name
     * @param age
     */
    int create(String name, Integer age);

    /**
     * name 으로 사용자 조회
     *
     * @param name
     * @return
     */
    List<User> getByName(String name);

    /**
     * name 기준으로 사용자 삭제
     *
     * @param name
     */
    int deleteByName(String name);

    /**
     * 사용자 전체 건수
     */
    int getAllUsers();

    /**
     * 사용자 삭제
     */
    int deleteAllUsers();

}

JdbcTemplate 로 Service를 구현클래스

@Service
public class UserServiceImpl implements UserService {

    private JdbcTemplate jdbcTemplate;

    UserServiceImpl(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    @Override
    public int create(String name, Integer age) {
        return jdbcTemplate.update("insert into USER(NAME, AGE) values(?, ?)", name, age);
    }

    @Override
    public List<User> getByName(String name) {
        List<User> users = jdbcTemplate.query("select NAME, AGE from USER where NAME = ?", (resultSet, i) -> {
            User user = new User();
            user.setName(resultSet.getString("NAME"));
            user.setAge(resultSet.getInt("AGE"));
            return user;
        }, name);
        return users;
    }

    @Override
    public int deleteByName(String name) {
        return jdbcTemplate.update("delete from USER where NAME = ?", name);
    }

    @Override
    public int getAllUsers() {
        return jdbcTemplate.queryForObject("select count(1) from USER", Integer.class);
    }

    @Override
    public int deleteAllUsers() {
        return jdbcTemplate.update("delete from USER");
    }

}

마지막으로 테스트 코드를 작성한다.

@RunWith(SpringRunner.class)
@SpringBootTest
public class Chapter31ApplicationTests {

    @Autowired
    private UserService userSerivce;

    @Before
    public void setUp() {
        // 테스트코드이니 일단 있는 테스트 사용자를 삭제한다.
        userSerivce.deleteAllUsers();
    }

    @Test
    public void test() throws Exception {
        // 사용자 5명 추가 
        userSerivce.create("Tom", 10);
        userSerivce.create("Mike", 11);
        userSerivce.create("Didispace", 30);
        userSerivce.create("Oscar", 21);
        userSerivce.create("Linda", 17);

        // Oscar라는 이름 사용자 조회 ,나이가 해당 나이인지 판다.
        List<User> userList = userSerivce.getByName("Oscar");
        Assert.assertEquals(21, userList.get(0).getAge().intValue());

        // 사용자 조회 , 5명이라고 가정하고 
        Assert.assertEquals(5, userSerivce.getAllUsers());

        // 2명 사용자 삭제
        userSerivce.deleteByName("Tom");
        userSerivce.deleteByName("Mike");

        // 삭제후 현재 사용자 몇명인지 , 3명 맞는지...판단.
        Assert.assertEquals(3, userSerivce.getAllUsers());

    }

}

JdbcTemplate 에 관련 더 많은 정보 와 사용방법은 아래 링크를 참조하면 된다.

 

끝!

 

'Springboot2.x 강좌 > DB연결' 카테고리의 다른 글

XML 로 Mybatis 설정하기  (0) 2023.01.05
Mybatis 로 Mysql 연결하기  (0) 2023.01.05
Spring Data JPA  (0) 2023.01.05
Druid datasource 연결  (0) 2023.01.05
Hikari 설정  (0) 2023.01.04

+ Recent posts