
이번주에는 SQL(MySQL, Oracle), Stream API를 이용한 자바 코드 리팩토링, Docker, JDBC, ELK Stack과 MySQL 동기화 프로젝트를 진행했다.
모든 내용을 일일이 작성하기에는 배운 내용이 너무 방대하여, 키워드 중심으로 정리하고 새롭게 배운 내용들 위주로 학습 정리를 진행할 예정이다.
다양한 SQL 함수에 대해 공부했다.
SYSDATE(), DATETIME, DATE, TIMECHAR,SIGNED, UNSIGNEDBINARY : 특정 컬럼의 대소문자 구분을 위한 추가 기본 설정.alter table emp change ename ename varchar(20) binary;
MySQL에서의 조건문
SELECT ename, job, sal,
CASE
when deptno = 10 then 'A부서'
when deptno = 20 then 'B부서'
else '무'
END as level
from emp e;
sql 구문을 보다 보면 여러 키워드가 나오는데, 이 구문의 실행 순서가 논리적으로 어떻게 진행되는지 알아보았다.
FROM 절에서 읽어온 데이터 중 조건을 만족하는 데이터를 필터링GROUP BY 절로 그룹화된 데이터 중 조건을 만족하는 그룹을 필터링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;
FROM : emp 테이블에서 데이터 가져오기WHERE : hiredate 가 null이 아닌 행 필터링GROUP BY : deptno 기준으로 데이터를 그룹화HAVING : 그룹화된 데이터 중 emp_count가 1보다 큰 그룹을 필터링SELECT : 필요한 컬럼을 선택, 각 집계 결과에 별칭 설정ORDER BY : total_sal 기준으로 내림차순 정렬| 특징 | MySQL | Oracle |
|---|---|---|
| 별칭 사용 (HAVING 절) | HAVING 절에서 SELECT 절의 별칭 사용 가능 | HAVING 절에서 SELECT 절의 별칭 사용 불가능 |
| 테이블 대소문자 구분 | 테이블 명 대소문자 구분 (운영체제에 따라 다름) | 테이블 명 대소문자 구분 없음 |
| 데이터 타입 | VARCHAR, TEXT, BLOB 등 | VARCHAR2, CLOB, BLOB 등 |
| SQL 표준 준수 | 비교적 유연함 | 더 엄격하게 SQL 표준 준수 |
다수의 테이블 간의 공통된 데이터를 기준으로 검색하는 명령

다른 쿼리 내에 포함된 쿼리.
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를 참조하는 데이터
CREATE TABLE emp03 (
empno int PRIMARY KEY,
ename varchar(10)
);
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)
);
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;
도커(Docker) 컨테이너는 소프트웨어를 통제할 수단을 제공한다. 도커를 활용하면 애플리케이션의 배포 및 런타임 문제(네트워크상에 노출하는 방법, 저장용량, 메모리, I/O를 관리하는 방법, 접근 권한을 통제하는 방법 등)가 애플리케이션 외부에서 처리되고 “컨테이너화”된 모든 앱에 걸쳐 일관된 방식으로 애플리케이션을 포장할 수 있다. 도커 컨테이너는 도커 런타임이 설치된 모든 OS 호환 호스트(리눅스 또는 윈도우)에서 실행할 수 있다.
출처: https://www.samsungsds.com/kr/insights/docker_container.html
애플리케이션을 신속하게 배포하고 실행할 수 있는 가상화 플랫폼
# 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>
원래 계획:
로컬(Mac) > UTM으로 설치한 Ubuntu > Docker > Oracle 설치
하지만 오라클이 Apple Silicon을 지원하지 않는 관계로 설치할 방법을 찾지 못했다.
따라서 로컬 Mac 환경에 Oracle을 설치하고 DBeaver와 연동하였다.
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
java.util.properties APIload() 메서드로 파일에서 읽어들이기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"));
}
}
kaggle의 타이타닉 데이터를 MySQL에 저장하고, 해당 데이터를 ELK Stack을 통해 시각화하여 인사이트를 도출하는 프로젝트를 진행하였습니다.
Github 바로가기
만 25세, 평생을 이과 + 공대생으로 살아왔던 나에게 글쓰기는 항상 어려운 일이다.

매일 노션에 그날 배운 내용을 정리하고, 길어지는 내용은 따로 페이지에 정리하고 있다.
하지만 날이 가면 갈수록 배운 내용을 그때그때 정리하기가 힘들다는 것을 깨닫고 있다.
특히 3주차는 새롭게 배운 내용 + 트러블슈팅 + 프로젝트가 겹쳐 해야 할 일이 정말 많았다.
전부 다 기록하고 싶었지만 쉽지 않아서 되는 데까지만 진행해 보았다.
하지만 매일 해놓은 내용을 기록하지 않는다면 금세 증발될 것이다.
조금만 더 노력한다면 나중에 큰 도움이 될 것을 알기에 꾸준히 기록할 생각이다.
그리고 여러 이모티콘을 많이 써두면 더 읽기 좋아지는 것을 깨달았다 🤣
공대생스럽지 않은 Readme를 작성하는 방법을 익히는 중.
이전 수업 때 배운 내용인 ELK Stack을 Ubuntu에 작성하는 방법을 적은 노션을 같은 수업을 듣는 분들께 공유했는데,
이 글을 보고 개인 노트북에서 똑같이 따라해서 설치를 하는데 성공하셨다고 하셔서 뿌듯함을 느꼈다.
유독 지난 주차보다 환경 설정에 애를 먹은 3주차였다.
오라클은 왜!! 애플 실리콘 칩을 지원하지 않는건가!!!!
맥 > UTM으로 우분투 > 그 위에 도커 > 그 위에 오라클 설치라는 복잡한 과정을 거치려 했으나
AMD64 버전과 호환되지 않는다 는 오류 메시지만 주구장창 나와서 포기해 버렸다.
그냥 교육에서 제공하는 윈도우 노트북을 얌전히 썼어야 했나.
하지만 맥북 프로의 트랙패드와 키보드에 이미 적응해버린 몸이라 그건 불가능했다.
어쩔 수 없이 로컬에 도커를 설치해서 그 위에 오라클을 설치하긴 했다.
항상 환경 설정을 할 때마다 오류 메시지가 뜨니깐 해탈할 지경이다.
오히려 안 뜨면 불안할지도..? 😢
3주차 결산 끝!