📚 학습정리

이번주에는 SQL(MySQL, Oracle), Stream API를 이용한 자바 코드 리팩토링, Docker, JDBC, ELK Stack과 MySQL 동기화 프로젝트를 진행했다.

모든 내용을 일일이 작성하기에는 배운 내용이 너무 방대하여, 키워드 중심으로 정리하고 새롭게 배운 내용들 위주로 학습 정리를 진행할 예정이다.

🧑🏻‍💻 SQL

다양한 SQL 함수에 대해 공부했다.

  • SYSDATE(), DATETIME, DATE, TIME
  • CHAR,SIGNED, UNSIGNED
  • BINARY : 특정 컬럼의 대소문자 구분을 위한 추가 기본 설정.
alter table emp change ename ename varchar(20) binary;

CASE-END

MySQL에서의 조건문

SELECT ename, job, sal,
	CASE 
		when deptno = 10 then 'A부서'
		when deptno = 20 then 'B부서'
		else '무'
	END as level
from emp e;

SQL 실행 순서

sql 구문을 보다 보면 여러 키워드가 나오는데, 이 구문의 실행 순서가 논리적으로 어떻게 진행되는지 알아보았다.

  1. FROM: 데이터를 읽어올 테이블이나 뷰를 결정
  2. WHERE: FROM 절에서 읽어온 데이터 중 조건을 만족하는 데이터를 필터링
  3. GROUP BY: 데이터를 그룹화
  4. HAVING: GROUP BY 절로 그룹화된 데이터 중 조건을 만족하는 그룹을 필터링
  5. SELECT: 데이터 선택 - 필요한 컬럼을 선택하거나 계산된 컬럼 생성
  6. ORDER BY: 데이터를 정렬
  7. LIMIT: 결과에서 반환할 행 수를 제한

예제

SELECT 
    deptno, 
    COUNT(*) AS emp_count, 
    SUM(sal) AS total_sal,
    AVG(sal) AS avg_sal
FROM emp
WHERE hiredate IS NOT NULL
GROUP BY deptno
HAVING emp_count > 1
ORDER BY total_sal DESC;
  1. FROM : emp 테이블에서 데이터 가져오기
  2. WHERE : hiredate 가 null이 아닌 행 필터링
  3. GROUP BY : deptno 기준으로 데이터를 그룹화
  4. HAVING : 그룹화된 데이터 중 emp_count가 1보다 큰 그룹을 필터링
  5. SELECT : 필요한 컬럼을 선택, 각 집계 결과에 별칭 설정
  6. ORDER BY : total_sal 기준으로 내림차순 정렬

MySQL과 Oracle의 차이

특징MySQLOracle
별칭 사용 (HAVING 절)HAVING 절에서 SELECT 절의 별칭 사용 가능HAVING 절에서 SELECT 절의 별칭 사용 불가능
테이블 대소문자 구분테이블 명 대소문자 구분 (운영체제에 따라 다름)테이블 명 대소문자 구분 없음
데이터 타입VARCHAR, TEXT, BLOB 등VARCHAR2, CLOB, BLOB 등
SQL 표준 준수비교적 유연함더 엄격하게 SQL 표준 준수

SQL Join

다수의 테이블 간의 공통된 데이터를 기준으로 검색하는 명령

키워드

  • Equi join
  • Not-equi join
  • Self join
  • Outer join

서브쿼리

다른 쿼리 내에 포함된 쿼리.

  • SELECT, FROM, WHERE, HAVING 절에 사용 가능.
  • 메인 쿼리에 필요한 데이터를 검색하거나 조건을 설정
select dname 
from dept 
where deptno=(
				select deptno 
				from emp 
				where ename = 'SMITH');

제약 조건

데이터베이스의 무결성과 정확성을 보장하기 위해 사용.
primary key, foreign key, not null 등의 제약 조건을 걸어 특정 조건을 만족하는 데이터만 테이블에 삽입되거나 유지

종류

  • Primary key, PK : 기본키, 중복불가, null불가, 데이터들 구분을 위한 핵심 데이터
  • not null : 반드시 데이터 존재
  • unique : 중복 불가, null 허용
  • check : table 생성시 규정한 범위의 데이터만 저장 가능
  • default : insert시에 특별한 데이터 미저장시에도 자동 저장되는 기본 값
    • 자바 관점에는 멤버 변수 선언 후 객체 생성 직후 멤버 변수 기본값으로 초기화
  • FK, Foreign key : 외래키[참조키], 다른 table의 pk를 참조하는 데이터
    • table간의 주종 관계가 형성
      • pk 보유 table이 부모, 참조하는 table이 자식

제약 조건 설정

  1. column에 제약조건명 없이 적용

CREATE TABLE emp03 (
	empno int PRIMARY KEY, 
	ename varchar(10)
);
  1. table 하단에 제약조건명 명시
CREATE TABLE emp03(
	empno int,
	ename varchar(10),
	deptno number(4),
	
	CONSTRAINT pk_emp03_empno PRIMARY KEY (empno)
	CONSTRAINT fk_emp04_deptno FOREIGN KEY (deptno) REFERENCES dept(deptno)
);
  1. alter으로 직접 추가
CREATE TABLE emp03 (
	empno int,
	ename varchar(10)
);

ALTER TABLE emp03 ADD CONSTRAINT pk_emp03_empno PRIMARY KEY (empno);
ALTER TABLE emp06 MODIFY (age DEFAULT 1);

제약 조건 삭제

ALTER TABLE emp03 DROP PRIMARY KEY;

-- foreign key 제약 조건 삭제 시 제약조건명을 기술해야 한다.
ALTER TABLE emp04 DROP CONSTRAINT fk_emp04_deptno; 

-- oracle drop default
ALTER TABLE emp06 MODIFY (age DEFAULT NULL);

-- mysql drop 
alter table emp06 alter age drop default;

🧑🏻‍🔧 자바 코드 리팩토링

[Notion] 재능기부 자바 프로젝트 리팩토링

🐳 Docker

도커(Docker) 컨테이너는 소프트웨어를 통제할 수단을 제공한다. 도커를 활용하면 애플리케이션의 배포 및 런타임 문제(네트워크상에 노출하는 방법, 저장용량, 메모리, I/O를 관리하는 방법, 접근 권한을 통제하는 방법 등)가 애플리케이션 외부에서 처리되고 “컨테이너화”된 모든 앱에 걸쳐 일관된 방식으로 애플리케이션을 포장할 수 있다. 도커 컨테이너는 도커 런타임이 설치된 모든 OS 호환 호스트(리눅스 또는 윈도우)에서 실행할 수 있다.
출처: https://www.samsungsds.com/kr/insights/docker_container.html

애플리케이션을 신속하게 배포하고 실행할 수 있는 가상화 플랫폼

  • 컨테이너(Container)라는 독립적인 환경을 사용하여 애플리케이션과 그 의존성을 패키지화
    애플리케이션이 어디서나 동일한 방식으로 실행될 수 있게 하여 개발, 테스트, 프로덕션 환경 간의 일관성을 유지

설치

# apt 인덱스 업데이트
$ sudo apt-get update

# 1. docker 설치
$ sudo apt install -y docker.io

# 2. 환경 설정 확인
$ who     # 현재 누가 접속해있는가
$ id      # uid: 사용자id, gid: 그룹id
$ pwd     # linux에서 현재 경로 확인 명령어
$ echo $USER
$ tail /etc/group    # id로 확인했던 정보가 저장되어있는 파일의 내용 일부
$ groups

$ sudo usermod -a -G docker $USER # docker 명령어 사용시 sudo 권한 부여하는 설정(재부팅 필수)
$ newgrp docker    # 설정한 그룹 즉각 인식하는 명령어, 생략시 재부팅 후에만 group 적용
$ groups
$ tail /etc/group

# 3. 컨테이너 실행 및 확인
$ docker ps  # 실행중인 컨테이너 확인 명령어
$ sudo docker run --name <container_name> -d -p <host_port>:<image_port> nginx
$ docker ps

# 4. 접속
$ docker exec -it <container_id> <cmd>

🫤 Docker를 통한 Oracle 설치 및 DBeaver 연동(Mac)

원래 계획:
로컬(Mac) > UTM으로 설치한 Ubuntu > Docker > Oracle 설치

하지만 오라클이 Apple Silicon을 지원하지 않는 관계로 설치할 방법을 찾지 못했다.
따라서 로컬 Mac 환경에 Oracle을 설치하고 DBeaver와 연동하였다.

[Notion] Mac에 Oracle 설치 및 DBeaver 연동 (Feat. Docker, Colima)

JDBC

개발 과정 및 순서

  1. 드라이버 로딩(메모리에 저장, 설치)
  2. 특정 DB에 접속 가능한 자바 객체를 생성
  3. 실행 가능한 SQL 문장 객체를 생성
  • new로 생성하는 것이 아니라, 특정 DB 접속 객체로부터 생성해야만 해당 DB와 소통 가능
  1. SQL 문장 실행
  2. DB 접속 해제

Properties

DB의 접속 설정, 연결 정보를 하드코딩하는 대신 별도의 파일로 분리.
접속 정보, 민감한 정보 등을 .properties 파일에 작성하고 해당 파일의 내용을 불러와서 사용.

.properties 파일

Key=Value 형식으로 구성되어 연결 정보를 저장하는 파일.

db.url=jdbc:mysql://localhost:3306/mydatabase
db.user=myusername
db.password=mypassword
db.driver=com.mysql.cj.jdbc.Driver

Properties 클래스

  • java.util.properties API
  • Property 파일로부터 Key를 분리해서 읽을 수 있음.
  • load() 메서드로 파일에서 읽어들이기
public class DBUtil {

	private static Properties p = new Properties();

	static {
		try {
			p.load(new FileInputStream("db.properties"));
			Class.forName(p.getProperty("jdbc.driver"));
		} catch (Exception e) {
			System.out.println("IO문제 발생");
			e.printStackTrace();
		}
	}

	// 접속 객체 생성해서 반환
	// db접속 문제자체를 호출한 곳으로 처리 위임
	// 접속 문제 -> ... -> controller에게 접속 이슈 관련된 유연한 처리 유도
	public static Connection getConnection() throws SQLException {

		return DriverManager.getConnection(p.getProperty("jdbc.url"), 
											p.getProperty("jdbc.id"),
											p.getProperty("jdbc.pw"));
	}
}

👏 ELK Stack과 MySQL 연동 프로젝트

kaggle의 타이타닉 데이터를 MySQL에 저장하고, 해당 데이터를 ELK Stack을 통해 시각화하여 인사이트를 도출하는 프로젝트를 진행하였습니다.
Github 바로가기

🤔 회고

😮‍💨 기록하기는 어려워

만 25세, 평생을 이과 + 공대생으로 살아왔던 나에게 글쓰기는 항상 어려운 일이다.

매일 노션에 그날 배운 내용을 정리하고, 길어지는 내용은 따로 페이지에 정리하고 있다.
하지만 날이 가면 갈수록 배운 내용을 그때그때 정리하기가 힘들다는 것을 깨닫고 있다.

특히 3주차는 새롭게 배운 내용 + 트러블슈팅 + 프로젝트가 겹쳐 해야 할 일이 정말 많았다.
전부 다 기록하고 싶었지만 쉽지 않아서 되는 데까지만 진행해 보았다.

하지만 매일 해놓은 내용을 기록하지 않는다면 금세 증발될 것이다.
조금만 더 노력한다면 나중에 큰 도움이 될 것을 알기에 꾸준히 기록할 생각이다.

그리고 여러 이모티콘을 많이 써두면 더 읽기 좋아지는 것을 깨달았다 🤣
공대생스럽지 않은 Readme를 작성하는 방법을 익히는 중.

이전 수업 때 배운 내용인 ELK Stack을 Ubuntu에 작성하는 방법을 적은 노션을 같은 수업을 듣는 분들께 공유했는데,
이 글을 보고 개인 노트북에서 똑같이 따라해서 설치를 하는데 성공하셨다고 하셔서 뿌듯함을 느꼈다.

🌍 환경 설정

유독 지난 주차보다 환경 설정에 애를 먹은 3주차였다.

오라클은 왜!! 애플 실리콘 칩을 지원하지 않는건가!!!!
맥 > UTM으로 우분투 > 그 위에 도커 > 그 위에 오라클 설치라는 복잡한 과정을 거치려 했으나
AMD64 버전과 호환되지 않는다 는 오류 메시지만 주구장창 나와서 포기해 버렸다.

그냥 교육에서 제공하는 윈도우 노트북을 얌전히 썼어야 했나.
하지만 맥북 프로의 트랙패드와 키보드에 이미 적응해버린 몸이라 그건 불가능했다.
어쩔 수 없이 로컬에 도커를 설치해서 그 위에 오라클을 설치하긴 했다.

항상 환경 설정을 할 때마다 오류 메시지가 뜨니깐 해탈할 지경이다.
오히려 안 뜨면 불안할지도..? 😢

3주차 결산 끝!

0개의 댓글