뷰(View)란 무엇이며, 언제 사용하나요?

김상욱·2024년 12월 14일

뷰(View)란 무엇이며, 언제 사용하나요?

뷰(View)는 데이터베이스의 중요한 개념 중 하나로 여러 테이블에서 파생된 가상 테이블을 의미합니다. 실제로 데이터를 저장하지 않으며, 미리 정의된 쿼리를 기반으로 필요할 때마다 동적으로 데이터를 생성. 뷰는 SELECT 문을 사용하여 정의되며 사용자는 마치 실제 테이블인 것처럼 뷰에 접근 가능

CREATE VIEW 뷰이름 AS
SELECT 컬럼1, 컬럼2, ...
FROM 테이블1
JOIN 테이블2 ON 조건
WHERE 조건;
  • 뷰는 물리적으로 데이터를 저장하지 않으며 정의된 쿼리에 따라 실시간으로 데이터를 생성
  • 복잡한 데이터 구조를 단순화하여 사용자나 애플리케이션이 쉽게 접근할 수 있도록 함.
  • 특정 컬럼이나 행에 대한 접근을 제한하여 민감한 데이터를 보호할 수 있습니다.
  • 자주 사용하는 복잡한 쿼리를 뷰로 정의하여 재사용할 수 있습니다.

뷰의 예시
예시1 : 직원 테이블과 부서 테이블이 있을 때 Sales 부서에 속한 직원 정보만을 제공하는 뷰.

CREATE VIEW SalesDepartmentEmployees AS
SELECT Employees.EmployeeID, Employees.Name, Departments.DepartmentName
FROM Employees
JOIN Departments ON Employees.DepartmentID = Departments.DepartmentID
WHERE Departments.DepartmentName = 'Sales';

예시 2: 모든 직원의 이름과 소속 부서만을 제공하는 뷰.

CREATE VIEW EmployeeNamesAndDepartments AS
SELECT Name, DepartmentID
FROM Employees;

제한 사항

  • 모든 뷰가 업데이트 가능하지 않음. 특히, 여러 테이블을 조인하거나 그룹화, 집계 함수를 사용하는 뷰는 데이터의 삽입, 수정, 삭제가 제한될 수 있음.
  • 복잡한 뷰는 성능에 영향을 미칠 수 있음. 뷰가 정의된 쿼리가 복잡할 수록 데이터 조회 시 더 많은 리소스가 소모.
  • 뷰가 여러 테이블이나 다른 뷰에 이존할 경우, 기본 테이블이나 다른 뷰의 변경이 뷰에 영향을 미칠 수 있음.

신입 및 취준생 Java Spring 백엔드 개발자의 입장에서 데이터베이스 뷰(View)를 학습하고 실습할 수 있는 방법은 다음과 같습니다. 실제로 뷰를 만들어보고 Spring 애플리케이션에서 활용해보는 실습을 통해 뷰의 개념과 사용법을 이해할 수 있습니다.


1. 뷰 생성 및 활용 실습

데이터베이스에서 뷰를 생성하고, Spring 애플리케이션에서 이를 조회하거나 활용하는 연습을 할 수 있습니다.

실습 준비

  • 로컬에서 MySQL, PostgreSQL 또는 H2 데이터베이스 설정.
  • Spring Boot 프로젝트 생성.
  • Spring Data JPA 또는 MyBatis를 활용하여 데이터베이스와 통신.

1단계: 데이터베이스 설정 및 테이블 생성

예제 테이블: 직원과 부서 정보

CREATE TABLE Employees (
    EmployeeID INT AUTO_INCREMENT PRIMARY KEY,
    Name VARCHAR(100),
    DepartmentID INT,
    Salary DECIMAL(10, 2)
);

CREATE TABLE Departments (
    DepartmentID INT AUTO_INCREMENT PRIMARY KEY,
    DepartmentName VARCHAR(100)
);

-- 데이터 삽입
INSERT INTO Departments (DepartmentName) VALUES ('Sales'), ('HR'), ('Engineering');
INSERT INTO Employees (Name, DepartmentID, Salary) 
VALUES 
    ('Alice', 1, 5000.00),
    ('Bob', 2, 4500.00),
    ('Charlie', 1, 5200.00),
    ('Diana', 3, 6000.00);

2단계: 뷰 생성

특정 부서의 직원 정보만 조회하는 뷰

CREATE VIEW SalesEmployees AS
SELECT e.EmployeeID, e.Name, d.DepartmentName, e.Salary
FROM Employees e
JOIN Departments d ON e.DepartmentID = d.DepartmentID
WHERE d.DepartmentName = 'Sales';

3단계: Spring Boot 프로젝트에서 뷰 활용

Spring Boot 프로젝트 설정

  1. Dependencies: Spring Data JPA, Spring Web, MySQL Driver (또는 사용하는 데이터베이스에 맞는 드라이버).
  2. application.properties/yml에 데이터베이스 연결 정보 설정.
spring.datasource.url=jdbc:mysql://localhost:3306/testdb
spring.datasource.username=root
spring.datasource.password=yourpassword
spring.jpa.hibernate.ddl-auto=none

Entity 클래스 생성

뷰를 조회하기 위한 DTO나 엔티티를 생성합니다.

@Entity
@Table(name = "SalesEmployees") // 뷰 이름
public class SalesEmployee {
    @Id
    private Integer employeeID;
    private String name;
    private String departmentName;
    private BigDecimal salary;

    // Getters and Setters
}

Repository 생성

JPA를 사용하여 뷰 데이터를 조회합니다.

public interface SalesEmployeeRepository extends JpaRepository<SalesEmployee, Integer> {
    // 뷰에 대한 별도 쿼리 필요 시 정의 가능
    List<SalesEmployee> findBySalaryGreaterThan(BigDecimal salary);
}

Controller 생성

Spring MVC를 통해 뷰 데이터를 클라이언트에 제공하거나 테스트합니다.

@RestController
@RequestMapping("/sales-employees")
public class SalesEmployeeController {
    
    private final SalesEmployeeRepository repository;

    public SalesEmployeeController(SalesEmployeeRepository repository) {
        this.repository = repository;
    }

    @GetMapping
    public List<SalesEmployee> getAllSalesEmployees() {
        return repository.findAll();
    }

    @GetMapping("/high-salary")
    public List<SalesEmployee> getHighSalaryEmployees(@RequestParam BigDecimal minSalary) {
        return repository.findBySalaryGreaterThan(minSalary);
    }
}

2. 뷰 활용 시나리오 실습

뷰의 장점을 실제로 체감하기 위해 다양한 상황에서 뷰를 활용해 봅니다.

1) 데이터 필터링 및 보안

  • 민감한 정보를 제외한 데이터를 뷰로 제공.
    • 급여 정보를 제외하고 이름과 부서 정보만 제공하는 뷰 생성.
CREATE VIEW PublicEmployeeInfo AS
SELECT Name, DepartmentName
FROM Employees e
JOIN Departments d ON e.DepartmentID = d.DepartmentID;

2) 데이터 추상화

  • 여러 테이블을 조인하는 복잡한 쿼리를 뷰로 단순화.
    • 모든 부서별 직원 수를 계산하는 뷰 생성.
CREATE VIEW DepartmentEmployeeCount AS
SELECT d.DepartmentName, COUNT(e.EmployeeID) AS EmployeeCount
FROM Employees e
JOIN Departments d ON e.DepartmentID = d.DepartmentID
GROUP BY d.DepartmentName;

Spring에서 이를 호출하여 차트용 데이터를 반환하도록 구현할 수 있습니다.


3. 추가 실습 아이디어

1) MyBatis를 활용한 뷰 조회

MyBatis를 사용해 뷰 데이터를 조회하는 매퍼를 작성하여 실습.

<select id="getAllSalesEmployees" resultType="SalesEmployee">
    SELECT * FROM SalesEmployees
</select>

2) 성능 분석

  • 뷰를 사용하는 쿼리와 원본 테이블 직접 쿼리의 성능을 비교.
  • 복잡한 뷰를 만들어서 Spring Boot Actuator를 통해 SQL 실행 시간을 측정.

4. 실습 목표 및 결과

  • 데이터베이스 뷰의 정의와 활용 이해: 복잡한 쿼리를 단순화하고 재사용성을 높이는 방법 학습.
  • Spring과 데이터베이스 통합 실습: JPA 또는 MyBatis를 활용해 뷰 데이터를 읽고 가공.
  • 프로젝트에 응용 가능성 검토: 뷰를 활용하여 데이터 보안, 추상화, 성능 최적화를 도입하는 연습.

권장 학습 흐름

  1. 단순 뷰 생성 → 데이터베이스에서 직접 쿼리로 활용.
  2. Spring Boot와 통합 → 뷰를 기반으로 API를 생성.
  3. 확장 실습 → MyBatis 적용, 성능 최적화, 뷰 업데이트 제약 확인.

이러한 실습은 Java와 Spring 백엔드 개발자로서 데이터베이스 뷰를 효율적으로 활용하는 실무 능력을 향상시키는 데 도움이 될 것입니다.

0개의 댓글