3주차에서는 Java DTO 객체 및 API 활용과 DB SQL 문법에 대해 배웠다.
상수 데이터 집합 (하나의 객체이다)
Enum 생성
package step01;
public enum Color {
// 상수형 객체
RED,
BLUE,
GREEN
}
정수형 또는 실수형의 범위를 지정하고 기능 수행
(long or int가 아닌 정확한 수치에 대한 계산)
다양한 인스턴스를 만들기 위한 생성 도구
주요 어노테이션 및 기능
| 어노테이션 | 기능 설명 |
|---|---|
@Getter / @Setter | 필드의 접근자(Getter)와 설정자(Setter) 메소드 자동 생성 |
@ToString | 객체의 정보를 출력하는 toString() 메소드 자동 생성 |
@EqualsAndHashCode | 객체 비교를 위한 equals(), hashCode() 메소드 자동 생성 |
@Data | 위 항목들(@Getter, @Setter, @ToString 등)을 모두 포함하는 종합 세트 |
@Builder | 복잡한 객체 생성을 유연하게 돕는 빌더 패턴 적용 |
@EqualsAndHashCode : 모든 필드를 다 비교
@EqualsAndHashCode(of = “비교하고 싶은 하나의 필드") : 하나의 필드만 비교 (of 사용)
생성자 관련 어노테이션
@NoArgsConstructor: 파라미터가 없는 기본 생성자 생성
@AllArgsConstructor: 모든 필드를 파라미터로 받는 생성자 생성
@RequiredArgsConstructor : final 필드나 @NonNull 필드만 파라미터로 받는 생성자 생성 (final 필드 : 필수 + 불변)
정적 팩토리 메서드 패턴 (Static Factory Method) : static 메서드로 객체의 생성을 단순화 하는 패턴
메서드를 이용한 객체 생성 (호출)
User user1 = User.*of*("java", "ADMIN");
User user2 = User.*createAdmin*("db");
빌더 패턴 : 복잡한 객체를 단계별로 생성할 수 있게 도와주는 패턴
public class Hamburger {
private final String bun; // 필수
private final int patty; // 필수
private final boolean cheese; // 선택
private final boolean lettuce; // 선택
}
// 사용 예시
Hamburger myBurger = new Hamburger.Builder("플레인번", 2)
.cheese(true)
.lettuce(false)
.build();
자바 프로젝트 빌드 자동화 및 의존성 관리 도구
핵심 기능
HTML을 자바 객체처럼 파싱 해주는 라이브러리
데이터를 저장하거나 전송할 때 사용하는 경량의 텍스트 기반 데이터 형식
어노테이션
| 어노테이션 | 역할 |
|---|---|
@JsonProperty | JSON의 키 이름과 자바 필드 이름을 매핑 (이름이 다를 때 필수) |
@JsonIgnore | 특정 필드를 JSON 결과에서 제외 (예: 비밀번호 등) |
@JsonFormat | 날짜(Date, LocalDateTime)의 출력 형식을 지정 |
@JsonInclude | 값이 null인 필드는 JSON에 포함하지 않도록 설정 |
@JsonNaming | 클래스 전체에 적용 (예: 모든 필드를 Snake Case로 일괄 변환) |
데이터를 테이블 형식으로 표현
관계형 데이터 베이스를 관리하는 시스템을 사용 → DB 활용
모델링
개념적 모델링 : 요구사항을 토대로 필요한 데이터는 무엇인지 등을 추려내는 것
논리적 모델링 : 데이터베이스의 논리적인 구조를 설계하는 것
물리적 모델링 : 논리적 모델을 물리적인 데이터베이스 구조로 변환하는 것
관계형 데이터베이스 특징
NoSQL 데이터베이스 (비관계형 데이터베이스)
테이블을 사용하지 않고 다양한 데이터 모델을 사용해서 데이터들을 저장하고 관리
→ 주로 대량의 분산 데이터 또는 유연한 데이터 모델이 필요한 환경에서 사용
구조
SELECT fields(속성명), ...
FROM table(테이블명)
WHERE field condition other table field
GROUP BY field
HAVING field condition
ORDER BY field
구조
SELECT column명(s)
FROM table1
INNER JOIN table2
ON table1.column명 = table2.column명;
// LEFT, RIGHT
SELECT column명(s)
FROM table1
LEFT JOIN table2
ON table1.column명 = table2.column;
구조
// 기본
메인 쿼리
(
서브쿼리
)
// 종류
SELECT field, (SELECT ...) -- 스칼라 서브쿼리(Scalar Sub Query)
FROM (SELECT ...) -- 인라인 뷰(Inline View)
WHERE field = (SELECT ...) -- 일반 서브쿼리
| 상황 | 추천 방식 | 이유 |
|---|---|---|
| 여러 테이블의 컬럼을 동시에 출력할 때 | JOIN | 서브쿼리는 SELECT 절에 컬럼당 하나씩 써야 해서 비효율적 |
단순히 존재 여부만 체크할 때 (EXISTS) | Subquery | 메인 테이블의 중복 방지 및 Early-exit(발견 즉시 종료) 가능 |
| 그룹화(GROUP BY) 후 그 결과와 비교할 때 | Subquery (Inline View) | 집계 데이터를 먼저 확정한 뒤 매칭하는 것이 논리적으로 명확함 |
| 데이터 양이 아주 많을 때 | JOIN | 옵티마이저가 인덱스를 활용한 조인 경로를 더 잘 찾음 |
문법
// INSERT
INSERT INTO table명 [(column1, column2, column3, ...)]
VALUES (value1, value2, value3, ...);
// UPDATE
UPDATE table명
SET column1 = value1, column2 = value2, ...
WHERE condition;
// DELETE
DELETE FROM table명 WHERE condition;
문법
// Database
CREATE DATABASE database명;
DROP DATABASE database명;
// CREATE
CREATE TABLE table명 (
column1 datatype,
column2 datatype,
column3 datatype,
....
);
// DROP
DROP TABLE table명;
// ALTER
ALTER TABLE table명
ADD column명 datatype;
ALTER TABLE table명
DROP COLUMN column명;
ALTER TABLE table명
MODIFY COLUMN column명 datatype;
제약 조건(Constraints)
// 기본 제약조건
NOT NULL - null 불가
UNIQUE - 고유한값 유지(중복 불가)
PRIMARY KEY - PK, 기본키, NOT NULL + UNIQUE, 행(레코드)를 구분
FOREIGN KEY - FK, 참조키, 다른 테이블의 컬럼(필드)를 참조
CHECK - 지정한 규칙의 데이터만 사용 가능
DEFAULT - 기본값 지정
문법
// 권한 옵션
ALL PRIVILEGES : 모든 권한
CREATE, DROP, ALTER : 테이블 DDL 권한
SELECT, INSERT, UPDATE, DELETE : 테이블 DQL, DML 권한
USAGE : 권한 없음(계정 생성시에만 사용)
// IP 주소
% : 모든 IP
127.0.0.1 : 자신
localhost : 자신
// USER
CREATE USER '계정명'@'IP주소' IDENTIFIED BY '비밀번호';
DROP USER '계정명'@'IP주소';
// GRANT
GRANT 권한 옵션 ON 데이터베이스명.테이블 TO '계정명'@'IP주소';
// REVOKE
REVOKE 권한 옵션 ON 데이터베이스명.테이블 FROM '계정명'@'IP주소';
// 적용
FLUSH PRIVILEGES;
Transaction : 수행하는 작업을 논리적으로 묶은 단위
// 예시
필요한 작업: MySQL -> DB 10만원 송금
① MySQL 계좌에서 10만원 차감 (UPDATE)
② DB 계좌에 10만원 추가 (UPDATE)
ACID
| 특성 | 영문 | 설명 |
|---|---|---|
| 원자성 | Atomicity | 트랜잭션 내 모든 작업이 전부 성공하거나 전부 실패함. 중간 상태는 없음 |
| 일관성 | Consistency | 트랜잭션 실행 전후로 데이터베이스가 일관된 상태를 유지함 |
| 격리성 | Isolation | 동시에 실행되는 트랜잭션들이 서로 영향을 주지 않음 |
| 지속성 | Durability | COMMIT된 트랜잭션은 시스템 장애가 발생해도 영구적으로 반영됨 |
락(Lock) - 데이터 잠금
여러 사용자가 동시에 같은 데이터에 접근할 때 데이터의 일관성을 보장하기 위해 접근을 제한하는 메커니즘
기존 MySQL 데이터베이스의 스키마, 테이블, 뷰, 관계(Foreign Key) 정보를 분석하여 시각적인 ERD(Entity Relationship Diagram) 모델로 자동 변환하는 기능
제1정규형 (1NF) - 원자값 (Atomic Value)
제2정규형 (2NF) - 부분 종속 제거
제3정규형 (3NF) - 이행 종속 제거