application.yml 파일은 스프링 부트의 환경설정을 위한 파일로, 데이터베이스 접속 정보, 포트번호, JPA 설정 등 프로그램 실행에 필요한 환경 변수, 값, 옵션을 한 곳에 모아 코드와 분리해서 편리하게 관리하는 파일이다.
참고로 위치는 src/main/resource 패키지에 저장하면 된다.
spring:
datasource:
url: jdbc:oracle:thin:@//localhost:1521/ORCLPDB1
username: system
password: 999999
driver-class-name: oracle.jdbc.OracleDriver
jpa:
database-platform: org.hibernate.dialect.OracleDialect
hibernate:
ddl-auto: update
show-sql: true
여기서 직접 설정을 변경해야 하는 항목은 다음과 같다.
url: localhost(서비스명), 1521(포트번호), ORCLPDB1(데이터베이스명)
username: 로그인 아이디
password: 로그인 비밀번호
필자는 미리 DB와 계정을 만들었기 때문에 그것을 사용하였다.
src/main/resource 폴터에 존재하는 application.properties의 내용에 아래 내용을 추가한다.
spring.application.name=korean
spring.datasource.url=jdbc:oracle:thin:@localhost:1521:orcl
spring.datasource.username=system
spring.datasource.password=99999
spring.datasource.driver-class-name=oracle.jdbc.OracleDriver
spring.jpa.database-platform=org.hibernate.dialect.OracleDialect
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
여기서 직접 설정을 변경해야 하는 항목은 다음과 같다.
1. username: 유저 아이디
2. password: 비밀번호
3. url: localhost(서비스명), 1521(포트번호), orcl(SID/인스턴스명)
4. spring.application.name: 프로젝트명
SID/인스턴스란? DB서버당 1개만 존재하는 이름이다. 이를 아래처럼 검색하면 나오는 결과를예제의 orcl 자리에 대체하여 넣으면 된다. 보통 xe로 잘못 표기되어 에러가 난다.
SELECT instance_name FROM v$instance;
public interface UserRepository extends JpaRepository<User, Long>
{
}
여기서 User는 아까 테이블을 선언했던 클래스 명이다. 이 인터페이스에 JpaRepository를 상속하면, 아래와 같은 CRUD 함수들을 만들지 않고도 사용할 수 있다.
userRepository.save(user); // 저장/수정
userRepository.findAll(); // 전체 조회
userRepository.findById(1L); // ID로 단건 조회
userRepository.deleteById(1L); // 삭제
userRepository.count(); // 전체 개수 조회
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
import webBoard.korean.dto.User;
import webBoard.korean.repository.UserRepository;
@Component // 이 클래스를 bean 으로 등록하여 사용하기 위해 사용
public class DbTestRunner implements CommandLineRunner {
@Autowired//new userRepository를 DI컨테이너에서 불러온다.
private UserRepository userRepository;
@Override
public void run(String... args) throws Exception {
// 저장
User user = new User();
user.setName("테스트");
user.setEmail("test@example.com");
userRepository.save(user);
// 조회 및 출력
userRepository.findAll().forEach(System.out::println);
}
}
build Gradle 파일에서 아래 2개의 의존성이 정확히 존재하는지 확인한다.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
runtimeOnly 'com.oracle.database.jdbc:ojdbc11'
}
spring-boot-starter-data-jpa: JPA 핵심 기능 + Hibernate(기본 구현체) + 트랜잭션 관리 등 JPA 동작에 필요한 모든 라이브러리, 엔티티 매핑, 자동 쿼리, Repository 등 JPA 관련 기능 제공
com.oracle.database.jdbc:ojdbc11: 오라클 DB와 통신하기 위한 JDBC 드라이버 (실제 DB 접속 및 쿼리 실행)
import jakarta.persistence.*;
import lombok.Data;
@Entity
@Table(name= "USERS")
@Data
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
@Override
public String toString() {
return "User(id=" + id + ", name=" + name + ", email=" + email + ")";
}
}
위 코드는 USERS 테이블을 만드는 예시이다. 원래는 getter, setter, tostring 함수를 만들어야 하나 lombok의 @Data 에너테이션으로 이를 생략하였다. @Entity는 이 클래스가 jpa로 만든 것임을 선언하고, @Table 은 테이블명을 선언한다.
toString함수를 오버라이딩 하면 객체 내부의 속성값들을 쉽게 확인할 수 있다.
이처럼 결과가 나오면 성공적으로 연결이 완료된 것이다.