Spring Boot DB 연결 - JdbcTemplate 사용

kangking·2024년 6월 20일
0

Spring Boot

목록 보기
3/10
post-thumbnail

Spring Boot DB연결

기존 순수자바로 연결할 때는

  • HikariCP
  • Pstmt
  • ResultSet
  • Connection
    위와 같은 연결 관련 객체들을 전부 직접 생성하여 사용했다.

하지만 Spring Boot는 DB설정 정보인 DataSource만 지정해두면 자동으로 위의 객체들을 Bean으로 생성해 관리해두기 때문에 DataTemplate 객체 하나로 전부 사용할 수 있다.

DataSource는 yml파일의 형태로 설정해둘 수 있다.


JdbcTemplate

Spring Boot에서 jdbc에 필요한 연결정보 및 기능들을 전부 담고 있는 클래스

DataSource, pstmt, rs 등등 기존에 나눠져 있던 요소들을 전부 포함하고 있다.


(DataSource 설정을 해두었다면 @Repository Bean이 생성될 때 자동으로 JdbcTemplate 내부에서 사용될 여러 객체들에 의존성 주입 됨)

  • 예시코드
    //연결
    public int save(BoardCreateReq req){
            int res = jdbcTemplate.update("INSERT INTO board (title, contents) values (?, ?)",
                    req.getTitle(),
                    req.getContents());
            return res;
        }

application.yml

실행되는 application의 각종 설정을 조작하는 파일로 여러개를 사용할 수 있으며 yml특성상 공백도 문법에 포함된다.

서버설정

기본 서버의 포트번호를 변경하는 등 서버와 관련된

DB설정

IP,포트번호,id,pwd등 db연결과 관련된 설정을 할 수 있다.

이 경우 보안을 위해 민감한 정보는 ${DBUSERNAME} 등으로 우선 비워두고 환경변수에서 설정해준다.

로깅 설정

로깅 레벨을 설정하여 로그의 상세도를 제어할 수 있다.

  • 예시 코드

    server:
      port: 8080
    
    spring:
      datasource:
        url: jdbc:mysql://localhost:3306/mydb
        username: myuser
        password: mypassword
      jpa:
        hibernate:
          ddl-auto: update
        show-sql: true
    
    logging:
      level:
        org.springframework: INFO

간단한 구현 및 테스트

대략적인 아키텍쳐

결과

  • http 요청

  • DB 테이블
    업로드중..

  • 응답

코드

  • Controller

    @RestController
    @RequestMapping("/board")
    public class BoardController {
    
        private final BoardService boardService;
    
        public BoardController(BoardService boardService) {
            this.boardService = boardService;
        }
    
        @PostMapping(value = "/create")
        public ResponseEntity<String> create(
                @RequestBody BoardCreateReq boardCreateReq
                ){
            String res = boardService.create(boardCreateReq);
    
            return ResponseEntity.ok(res);
        }
    }
  • Service

    public class BoardService {
    
        private final BoardRepository boardRepository;
    
        public BoardService(BoardRepository boardRepository) {
            this.boardRepository = boardRepository;
        }
    
        public String create(BoardCreateReq boardCreateReq){
            int result = boardRepository.save(boardCreateReq);
            if (result > 0){
                return boardCreateReq.getTitle()+"저장 성공";
            }else {
                return "저장 실패";
            }
        }
    }
  • Repository

    @Repository
    public class BoardRepository {
    
        private JdbcTemplate jdbcTemplate;
    
        public BoardRepository() {
        }
    
        //생성자가 하나일경우에만 생략 가능
        @Autowired
        public BoardRepository(JdbcTemplate jdbcTemplate) {
            this.jdbcTemplate = jdbcTemplate;
        }
    
        public int save(BoardCreateReq req){
            int res = jdbcTemplate.update("INSERT INTO board (title, contents) values (?, ?)",
                    req.getTitle(),
                    req.getContents());
            return res;
        }
    }
profile
하루하루 의미있게

0개의 댓글