Math.pow
를 사용하지 않고 거듭제곱을 구하시오.
public long power(int base, int exponent) {
if(exponent==0) return 1;
--exponent;
return base*power(base,exponent)%94906249;
}
모든 테스트케이스 통과 but 시간복잡도 O(logN)
을 만족하지 못했다.
public long power2(int base, int exponent) { // 시간복잡도 bad
long base2 = base;
int exponent2 = exponent;
long result = 1;
while (exponent2>1){
if(exponent2%2==0){
base2= base2*base2%94906249;
exponent2 = exponent2/2;
}else{
result = result*base2%94906249;
--exponent2;
}
}
return result*base2%94906249;
}
모든 테스트케이스 통과 && 시간복잡도 = O(logN)
JDBC
- 데이터를 데이터베이스에 저장 및 업데이트 하거나 데이터베이스에 저장된 데이터를 사용할 수 있도록 해주는 Java에서 제공하는 표준 API
- JDBC API를 사용해서 다양한 벤더(Oracle, MS SQL, MySQL 등)의 데이터베이스와 연동 가능
Connection 객체
= DB와 연결되는 객체
Statement 객체
= SQL 쿼리문을 실행하기 위해 사용하는 객체
위와 같은 방식으로 하면 속도가 느려서 Connection Pool
을 사용한다.
Connection Pool
- 미리 만든 Connection을 보관하고 필요할 때 꺼내주는 역할을 하는 관리자
- Connection 객체를 생성하는데 시간이 오래 걸려서 로딩 시점에 미리 만들어두고 사용한다.
SQL 중심 기술
- SQL 쿼리문을 애플리케이션 내부에 직접적으로 작성하여 DB에 접근하는 기술
- ex. mybatis, Spring JDBC 등
객체(Object) 중심 기술 - ORM(Object-Relational Mapping)
- 모든 데이터를 객체(Object) 관점으로 바라보는 기술
- Java 객체(Object)를 SQL 쿼리문으로 자동 변환 한 후에 DB에 접근
- JPA, Spring Data JDBC 등
Spring Data JDBC
- 데이터와 java object를 연계하기 위해 제공되는 Spring Data의 라이브러리 중 하나
- ORM 기술을 사용
Spring Data JDBC를 사용하기 위해서는 build.gradle의 dependencies에 아래와 같은 의존 라이브러리를 추가해야한다.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
runtimeOnly 'com.h2database:h2' // 데이터관리 쉽게하기 위해서 인메모리(In-memory) DB인 H2를추가
}
인메모리(In-memory) DB
- 메모리 안에 데이터를 저장하는 데이터베이스
- 메모리 = 휘발성 저장공간(껏다키면 사라짐)
- 테스트 환경에서 주로 사용
application.properties
파일 확장자를 application.yml로 바꾸고 아래 코드를 입력해 설정을 추가한다.spring:
h2:
console:
enabled: true
path: /h2 // Context path 변경
datasource:
url: jdbc:h2:mem:test //#JDBC URL 변경
sql:
init:
schema-locations: classpath*:db/h2/schema.sql // 테이블 생성 파일 경로
추가한 뒤에 프로젝트 실행시키면 아래와 같이 나온다.
localhost:8080/h2
를 입력jdbc:h2:mem:test
를 입력 후 Connect 버튼 누르기H2 Browser 로그인 성공!
CrudRepository
인터페이스
@ID
schema.sql
파일 (MESSAGE 테이블 생성 스크립트)
CREATE TABLE IF NOT EXISTS MESSAGE (
message_id bigint NOT NULL AUTO_INCREMENT,
message varchar(100) NOT NULL,
PRIMARY KEY (message_id)
);
엔티티(Entity) 클래스 이름은 데이터베이스 테이블의 이름에 매핑되고, 엔티티 클래스 각각의 멤버 변수는 데이터베이스 테이블의 컬럼에 매핑된다.
application.yml
파일의 설정 정보 등록을 통해 데이터베이스 설정, 데이터베이스의 초기화 설정 등의 다양한 설정을 할 수 있다.
application.properties
방식보다 application.yml
방식이 선호되는 추세다.