[JAVA 프로그래밍 면접 이렇게 준비한다] 자바 애플리케이션과 데이터베이스 통합하기

ho's·2022년 7월 25일
0

현재 데이터베이스와 자바를 연동하는데, 개념을 잘 모르겠어서 도서관을 왔다. 위의 책의 내용을 정리하고 말할 수 있도록 정리하는 것이 이 글을 쓰는 목표다.


질문들

1. 🔍 관계형 데이터베이스에서 SQL을 사용해 어떻게 검색할 수 있는가?

  • SQL은 도메인에 의미를 갖는 표현을 제공함으로써 관계형 데이터베이스의 데이터를 관리하고 추출할 수 있는 유연한 언어이다.

2. 🔍 내부조인과 외부조인은 무엇인가?

  • 조인이란 여러 테이블에 있는 정보 중 사용자가 필요한 정보만을 가져와 가상의 테이블처럼 만들어서 결과를 보여주는 것으로 n개의 테이블을 조합하여 하나의 열로 표현한 것이다.

  • INNER JOIN은 키 값이 있는 테이블의 칼럼 값을 비교해서 맞는 값을 가져오는 것.
    한마디로 서로 관련된 내용을 검색해 가져오는 방법이다.

내부조인

SELECT 테이블명.칼럼명, ... FROM 테이블명1 
INNER JOIN 테이블명2
ON 테이블명1.컬럼명1 = 테이블명2. 컬럼명2;
SELECT (얻을 컬럼) FROM 테이블명1
INNER JOIN 테이블명2 ON (조인 조건);
select *
from A,B
A.칼럼=B.칼럼

외부조인

  • 두 테이블에 각각 결합이 되는 컬럼을 지정하고 컬럼에 같은 값이 저장 되어 있는 데이터를 결합하여 받아온다. 내부 조인의 경우는 일치하지 않는 데이터를 검색하지 않았지만 외부 조인의 경우 일치하지 않는 경우도 데이터로 받아온다.
SELECT 테이블명. 컬럼 명, ... FROM 테이블명1
  LEFT OUTER JOIN 테이블명2
  ON 테이블명1.컬럼명1 = 테이블명2.컬럼명2;
SELECT (조회 컬럼) FROM 테이블명1
  LEFT OUTER JOIN 테이블명2 ON (조인 조건);

3.🔍 SQL은 데이터베이스의 데이터를 분석할 수 있는가?

  • SQL은 열을 계산할 수 있는 함수가 많다.
SELECT COUNT(*) from employees;

employees 테이블 행의 개수를 반환한다.

SUM함수, AVG함수, GROUP BY 등으로 정렬도 가능하다.

4.🔍 데이터를 데이터베이스에 어떻게 저장하는가?

  • INSERT 구문은 테이블에 데이터를 저장하고, UPDATE는 현재 행을 수정하며, DELETE는 행을 삭제한다.
INSERT INTO 테이블이름(필드이름1, 필드이름2, 필드이름3, ...)
VALUES (데이터값1, 데이터값2, 데이터값3, ...)
INSERT INTO 테이블이름
VALUES (데이터값1, 데이터값2, 데이터값3, ...)

위 2가지 모두 같은 결과를 갖지만, 두번째로 할 경우 예상치 못한 오류를 발생할 수 있다. 번거럽더라도 첫번째와 같은 방법으로 데이터를 INSERT하는 습관을 갖자.

  • UPDATE를 하려면 변경할 열, 새로운 값, 옵션으로 어떤 행을 업데이트할것인지 조건을 명시해야 한다.

UPDATE 예제

UPDATE employees
set home_address - "37, King Street"
where employee_number = 6;

DELETE 예제

DELETE FROM employees WHERE name = "wooyoungwoo";

WHERE 구문을 생략할 경우 모든 행이 삭제된다.

  • 데이터를 변경할때는 항상 트랜잭션을 사용해야 한다.
  • 트랜잭션은 커밋하기 전의 모든 실수들을 ROLLBACK 할 수 있게 해준다.

5.🔍 DDL과 DML은 무엇인가?

  • DML은 SELECT, INSERT, UPDATE, DELETE 등의 키워드를 사용해 데이터를 관리하는 데 사용되는 구문의 집합.

  • DDL은 테이블 구조를 생성하고 관리하는데 사용되는 구문의 집합.

예를들어 테이블을 만드는 쿼리문을 작성해보자

CREATE TABLE meeting_rooms(
	meeting_room_id INT,
    office_location_id INT,
    meeting_room_name VARCHAR(100)
);

열을 추가하는 작업을 해보자

ALTER TABLE meeting_rooms ADD COLUMN telephone_extension VARCHAR(100);

열을 삭제하기 위한 구문을 보자

ALTER TABLE meeting_rooms DROP COLUMN telephone_extension;

5.🔍 제약조건은 무엇인가?

  • 제약조건이란 데이터의 무결성을 지키기 위해 제한하는 조건을 말한다.
  • 데이터의 무결성이란 '데이터에 결합이 없음'을 뜻한다.

6.🔍 기본키(PK)란 무엇인가?

  • 테이블에는 많은 행 데이터가 있다. 이 중에서 데이터를 구분할 수 있는 식별자를 기본키(Primary key)라고 부른다.
  • 기본키는 중복될 수 없으며, NULL 값이 입력될 수 없다.

예시

CREATE TABLE member
( mem_id CHAR(8) NOT NULL PRIMARY KEY,
  mem_name VARCHAR(10) NOT NULL,
  height TINYINT UNSIGEND NULL
);

또는 PK를 설정하지 않은 member테이블을 만든 후,

CREATE TABLE member
( mem_id CHAR(8) NOT NULL,
  mem_name VARCHAR(10) NOT NULL,
  height   TINYINT UNSIGNED NULL
);

ALTER TABLE을 이용해 PK를 수정할 수 있다.

ALTER TABLE member
	ADD CONSTRAINT
    PRIMARY KEY(mem_id);

6.🔍 외래키(FK)란 무엇인가?

외래키란?

FOREIGN KEY 제약 조건을 설정한 필드는 외래 키라고 부르며, 한 테이블을 다른 테이블과 연결해주는 역할을 합니다.

외래 키가 설정된 테이블에 레코드를 입력하면, 기준이 되는 테이블의 내용을 참조해서 레코드가 입력됩니다.

즉, FOREIGN KEY 제약 조건은 하나의 테이블을 다른 테이블에 의존하게 만듭니다.

FOREIGN KEY 제약 조건을 설정할 때 참조되는 테이블의 필드는 반드시 UNIQUE나 PRIMARY KEY 제약 조건이 설정되어 있어야 합니다.

  • 두 테이블 사이의 관계를 연결해주고, 그 결과 데이터의 무결성을 보장해 주는 역할을 한다.
  • 참조테이블이 참조하는 기준테이블의 열은 반드시 기본키나, 고유키로 설정이 되어야 한다.

FK를 설정해 보자

CREATE TABLE buy
(
num INT AUTO_INCREMENT PRIMARY KEY,
mem_id CHAR(8) NOT NULL,
prod_name CHAR(6) NOT NULL
);

ALTER TABLE buy
	ADD CONSTRAINT
    FOREIGN KEY(mem_id) REFERENCES member(mem_id);

7. 🔍 비효율적인 쿼리는 어떻게 높일 수 있는가?

SELECT * FROM employees WHERE office_location_id = 2;

위 쿼리는 WHERE문이 맞는지 확인하기 위해 모든 행을 순서대로 점검한다. 테이블에 수천 개의 행이 있다면 이 쿼리는 실행하는 데 시간이 많이 소요된다. 특히 조건에 맞는 쿼리가 없으면 더 그렇다.

  • 인덱스를 사용하는데 더 많은 디스크 공간이 필요하지만 데이터를 찾는 시간은 빨라 질 것이다.

8. 🔍 SQL로 데이터베이스를 다루기가 여의치 않을 때는 무엇을 할 수 있는가?

  • 저장 프로시저는 SQL이 제공하는 다눈한 생성, 읽기, 수정, 삭제보다 많은 기능을 제공한다.

9. 🔍 트랜잭션은 무엇인가?

  • 트랜잭션은 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 또는 한꺼번에 모두 수행되어야 할 일련의 연산들을 의미한다.

ACID
A(Atomic) - 원자성

  • 트랜잭션 내에서는 모든 연산이 모두 완료가 되거나 실패하거나 둘 중 한가지 상태를 보증한다.
    어떤 이유로든 시도하는 변경 내역이 실패하면 전체 연산은 중단되고 마치 아무런 변경사항도 없는 것 처럼 보인다.
    C(Consistent) - 일관성
  • 데이터베이스가 변경되면, 유효하며 일관된 상태로 유지된다.
    I(Isolation) - 격리
  • 여러 트랜잭션이 간섭 없이 동시에 작동할 수 있다. 이는 어떤 트랜잭션 중에 이뤄진 모든 중간 상태 변경이 다른 트랜잭션에 보이지 않게 하는 방법으로 달성된다.
    D(Durable) - 내구성
  • 일단 트랜잭션이 완료되고 나면 시스템 오류가 발생하는 상황에서도 데이터가 손실되지 않는다고 보장한다.

트랜잭션에 예제를 살펴보도록 하자.
일관성과 격리 내구성에 대한 것은 예제를 통해 알아보기가 쉽지 않다고 한다.
원자성에 대해서만 예제를 다루어보자.
https://www.sqlitetutorial.net/sqlite-transaction/ 의 코드를 참고했다.

  1. 테이블 만들기
CREATE TABLE accounts ( 
	account_no INTEGER NOT NULL, 
	balance DECIMAL NOT NULL DEFAULT 0,
	PRIMARY KEY(account_no),
        CHECK(balance >= 0)
);

CREATE TABLE account_changes (
	change_no Integer PRIMARY KEY auto_increment,
	account_no INTEGER NOT NULL, 
	flag TEXT NOT NULL, 
	amount DECIMAL NOT NULL, 
	changed_at TEXT NOT NULL 
);
  1. 데이터 입력하기
INSERT INTO accounts (account_no,balance)
VALUES (100,20100);

INSERT INTO accounts (account_no,balance)
VALUES (200,10100);

  1. 트렌젝션 시작하기
    mysql은 START TRANSACTION; 으로 트랜젝션을 실행한다.
    현재 시각을 나타내는 함수는 now() 를 사용한다.
START TRANSACTION;

UPDATE accounts
   SET balance = balance - 1000
 WHERE account_no = 100;

UPDATE accounts
   SET balance = balance + 1000
 WHERE account_no = 200;
 
INSERT INTO account_changes(account_no,flag,amount,changed_at) 
VALUES(100,'-',1000,now());

INSERT INTO account_changes(account_no,flag,amount,changed_at) 
VALUES(200,'+',1000,now());

COMMIT;
  1. 확인하기
SELECT * FROM account_changes;

10. 🔍 NoSQL이란 무엇인가?

  • NoSQL은 관계형 데이터베이스 모델을 따르지 않는 데이터베이스를 의미한다. 반정규화에 의존하며 저장소에 테라바이트나 페타바이트 단위의 거대한 데이터를 처리할 때 애플리케이션이 가능한 한 빨리 데이터를 찾을 수 있도록 전체 문서나 그래프를 키-값 쌍으로 저장한다.

11. 🔍 관계형 데이터베이스에 연결하기 위해 자바를 어떻게 사용하는가?

  • JDBC(Java Database Connectivity)는 데이터베이스에 연결하기 위해 표준 자바 라이브러리에 내장된 메커니즘이다.

  • 데이터베이스에 연결하기 위해 JDBC를 이용할 때는 벤더의 JDBC 구현 라이브러리가 클래스 패스에 있는지 확인해야 한다.

  • 자바6 이전 버전에서는 JDBC 드라이버가 Class.forName() 호출을 통해 클래스 로더에 의해 로드됐는지 확인해야 한다.

  • 그레이들을 이용해서 쉽게 jar파일을 불러 올 수도 있다.

12. 🔍 SQL 쿼리를 실행하기 위해 자바를 어떻게 사용하는가?

  • 성공적으로 연결된 후에는 데이터를 검색하고 관리하기 위해 SQL 연산을 실행하고 싶을 것이다.
import java.sql.*;
    Connection c = null;
        try{
            Class.forName("com.mysql.cj.jdbc.Driver");
        }catch(ClassNotFoundException ex){
            System.out.println("JDBC error" + ex.getMessage());
            ex.printStackTrace();
        }
  • Class.forname 을 이용해 구현라이브러리가 있는지 확인하자.
  • try, catch를 이용해 예외 처리
 try{
            c = DriverManager.getConnection("jdbc:mysql://localhost:3306/classicmodels","root","gkseogh1!23");
            String sql = "select employeeNumber, lastName, firstName, extension, email, officeCode, reportsTo, jobTitle from employees";
            try(PreparedStatement ps = c.prepareStatement(sql)){
                ResultSet rs = ps.executeQuery();

                while(rs.next()) {
                    int employeeNumber = rs.getInt("employeeNumber");
                    String lastName = rs.getString("lastName");
                    String firstName = rs.getString("firstName");
                    String extension = rs.getString("extension");
                    String email = rs.getString("email");
                    String officeCode = rs.getString("officeCode");
                    int reportsTo = rs.getInt("reportsTo");
                    String jobTitle = rs.getString("jobTitle");

                    System.out.println(employeeNumber + "," + lastName + ","+ firstName + ","+ extension + ","+ email +"," + officeCode +","+reportsTo+","+jobTitle);
                }
                rs.close();
                }
        }catch(SQLException ex){
            ex.printStackTrace();

        }
  • DriverManger.getConnection();의 값을 이용해 경로/id/password를 입력하자.
  • 쿼리문을 String 형식으로 저장한다.
  • Java와 sql을 연결해주는 Connection 객체 c를 통해서 prepareStatement(sql)을 PreparedStatement 객체 ps에 담는다.
  • executeQuery()의 결과를 ResultSet 객체 rs에 담고, while문을 통해 값을 저장한다.

13. 🔍 데이터베이스 연결은 어떻게 관리해야 하는가?

  • 데이터베이스 연결은 제한된 자원을 이용하며, 연결을 만드는 절차는 시간을 많이 소모한다. 특히 네트워크를 통해 연결이 이뤄져야 할 때 더 그렇다. 이런 이유로 데이터베이스 연결을 만드는게 데이터베이스 연산보다 시간이 더 오래 걸리는 건 흔히 있는 일이다.

애플리케이션은 종종 데이터베이스 커넥션 풀을 관리하는데, 스레드풀과 비슷하다. 몇몇 오픈 소스 라이브러리는 커넥션 풀을 생성해서 작업하는데, 이는 모두 다음 접근 방법을 이용한다.

  • 연결을 어떻게 만들어야 하는지에 대한 세부 사항과 함께 라이브러리를 제공한다.
  • 연결이 필요할 때는 라이브러리가 커넥션을 제공한다.
  • 새 연결을 만들거나 이전에 만들었던 걸 재사용해서 이 과정에 소요되는 시간을 줄여준다.

참고글 : https://helloworld92.tistory.com/34
https://araikuma.tistory.com/724?category=874473
http://www.tcpschool.com/mysql/mysql_constraint_foreignKey
트랜잭션은 무엇인가?
https://coding-factory.tistory.com/226
https://www.youtube.com/watch?v=0DnuiH_nnoQ
https://www.sqlitetutorial.net/sqlite-transaction/

profile
그래야만 한다

0개의 댓글