database, JDBC

지원·2026년 2월 23일

SpringBoot

목록 보기
5/17
post-thumbnail

application.yml 설정 (권장)

spring:
	datasource:
    	url: "jdbc:mysql://localhost/library"	//접근하려는 mysql이 localhost에 있다. 접근하려는 DB는 libray
        username: "root"	//mysql에 접근하기 위한 계정명
        password: ""						//mysql 비밀번호
        drvier-class-name: com.mysql.cj.jdbc.Driver
        //데이터베이스에 접근할 때 사용할 프로그램
        //Ctrl + 클릭: 실제 드라이버 코드 확인 가능

application.properties 설정 (=application.yml)

#DataSource
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/spring_db
spring.datasource.username=spring_user
spring.datasource.password=abc123

오류 로그 확인법

#enable jdbc log
logging.level.org.springframework.jdbc=debug

모델 객체 생성

@Table
@Id
@Table
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Member {
    @Id
    private Long id;
    private String name;
    private String email;
    private Integer age;
}

테이블과 연동하기 위한 모델 객체 작성
@Table 어노테이션을 사용해 클래스와 테이블 연동
PK 제약조건을 부여할 컬럼과 매핑될 필드에 @Id 어노테이션 사용

database 연결

  • Ctrl + Shift + N : 파일 찾기
  • Controller에서
@RestController
public class UserController {
	private final JdbcTemplate jdbcTemplate;	//JDBC에 대한 클래스
    
    public UserController(JdbcTemplate jdbcTemplate) {	//JDBC 선언 후 생성자 생성
    	this.jdbcTemplate = jdbcTemplate;
    }
    
    @PostMapping("/user")
    public void saveUser(@RequestBody UserCreateRequest request) {
    	String sql = "INSERT INTO user(name, age) VALUES(?, ?)";
        jdbcTemplate.update(sql, request.getName(), request.getAge());
        
    // 기존) users.add(new User(request.getName(), request.getAget()));
    }
}
  • build.gradle 추가
  1. maven repository에서 mysql 찾기
  2. buld.gradle dependencies에 한 줄 추가
  3. Gradle 동기화

POST API 변경

Ctrl + O : 오버라이드가 필요한 매개
Alt + enter : 람다식 변경

  • 긴 코드가 주어진 sql(select절)을 수행해서 나온 결과들을 UserResponse로 바꿔주는 로직
@GetMapping("/user")
public List<UserResponse> getUsers() {
	String sql = "SELECT * FROM user";
    return jdbcTemplate.query(sql, new RowMapper<UserResponse>() {	//RowMapper 구현 익명클래스)
    	@Override
        public UserResponse mapRow(ResultSet rs, int rowNum) throws SQLException {
        	long id = rs.getLong("id");
            String name = rs.getString("name");
            int age = rs.getInt("age");
            return new UserResponse(id, name, age);		// id, name, age 생성자룰 UserResponse에 만들어준다
        }
    });
}
@GetMapping("/user")
public List<UserResponse> getUsers() {
	String sql = "SELECT * FROM user";
    return jdbcTemplate.query(sql, (rs, rowNum) -> {
    	long id = rs.getLong("id");
        String name = rs.getString("name");
        int age = rs.getInt("age");
        return new UserResponse(id, name, age);
        }
    });
}
//람다식 활용방법

API에서 데이터 존재 여부를 확인해 예외를 던지기

@PutMapping("/user")
public void updateUser(@RequestBody UserUpdateRequest request) {
	String readSql = "SELECT * FROM user WHERE id =?";
    boolean isUserNotExist = jdbcTemplate.query(readSql, (rs, rowNum) -> 0, request.getId()).isEmpty();
    if(isUserNotExist){
    throw new IllegalArgumentException();
    }
    
    String sql = "UPDATE user SEt name = ? WHERE id = ?";
    jdbcTemplate.update(sql, request.getName(), request.getID();
}

HikariCP

  • 데이터베이스 연결을 관리해주는 도구
  • 커넥션 풀 구현체
  • 부트 설정파일에서 커스터마이징 가능
    ex) 데이터베이스 연결을 최대 20개까지 생성해 어플리케이션에서 20개의 작업을 할 수 있도록 설정
    ex) 어플리케이션이 데이터베이스를 연동하지 않아도 데이터베이스 연결을 최소 10개 유지하도록 설정
    ex) HikariCP 로깅 레벨 설정
profile
개발 공부하는 김지원

0개의 댓글