1. 새로운 지식
JVM
- JVM 구성요소 블록 다이어그램(JVM Spec)
- 각각의 구성요소는 언제까지나 추상적인 spec임. 이걸 어떻게 구현할지는 구현하는 사람이 결정할 문제
- 어떤 구현체던지 상관없이, 표준 스펙에 따르면 JVM에는 다음과 같은 추상적인 구성요소를 가짐
class loader subsystem
runtime data areas
execution engine
JNI (Java Native Interface)
-> 다이어그램에는 native method interface라고 적혀있다.Native Method Libraries
- JVM에서 프로그램을 실행하게 되면, 바이트코드를 포함해서 메소드의 파라미터, 리턴값, 연산의 중간값과 같은 데이터를 저장할 공간이 필요하다. JVM은 이런 데이터를 저장할 공간을 조직하는데, 이것이
runtime data areas
이다.- method area와 heap은 jvm에서 실행되는 모든 스레드가 공유한다.
- 그 외 나머지 영역은 각 스레드마다 별도로 생성된다.
- method area와 heap은 jvm에서 실행되는 모든 스레드가 공유한다.
- JVM 구성요소 블록 다이어그램(JVM Spec)
SQL
중복없이 선택하기
퀘스트 1번에 나온 데이터를 보면 직급에 중복이 없다.
당연히 일반
select
문으로 쿼리를 작성하면 중복없이 직급이 선택이 된다.SELECT position FROM sparta_employees;
하지만 중복된 값이 있다면 자동으로 중복을 제거해줄지 궁금했다.
그래서 임의로 중복된 직급을 갖도록 데이터를 추가했고 쿼리를 실행한 결과!
데이터가 중복되는 것을 확인하였다.
간단하게
DISTINCT
를 추가해주면 중복없이 데이터를 조회할 수 있다.SELECT DISTINCT position FROM spart_employees;
LIKE
부분 문자열을 포함하는 쿼리문을 작성할 때는 where 절에
LIKE
를 사용하면 좋다.LIKE
뒤에는 패턴을 적어주어야 하는데, 패턴에는 주로%
와_
가 사용된다.%
는 모든 문자를,_
는 한 글자를 지칭한다.즉, 상품 이름에 문자열
'프로'
가 포함된 패턴을 찾고 싶다면,WHERE product_name LIKE '%프로%'
와 같이 적어볼 수 있다.
2. 인사이트
- JVM에서 스레드 간에 공유되는 영역을 보고, 운영체제의 프로세스/스레드 간의 메모리 영역과 많이 비슷한 구석이 있는것 같다고 느꼈다.
- 그래서 Java "Virtaul Machine"이라는 이름이 붙게 되지 않았을까 생각해본다.
3. 문제 해결
SQL 퀘스트 실습을 위해 예전에 깔아두었던 mysql을 다시 키려 하는데 root 비밀번호가 생각나지 않았던 문제
비밀번호를 초기화 하는 방법
mysql 서비스 종료
→
brew services stop mysql
mysqld 초기화 후 재시작
데이터가 더 이상 필요하지 않은 경우 권장
→
mysqld --initialize
로그 확인을 위해
--console
옵션을 더 붙여주었다.2024-09-19T06:30:34.256881Z 0 [System] [MY-015017] [Server] MySQL Server Initialization - start. 2024-09-19T06:30:34.269508Z 0 [System] [MY-013169] [Server] /opt/homebrew/Cellar/mysql/8.3.0_1/bin/mysqld (mysqld 8.3.0) initializing of server in progress as process 67273 2024-09-19T06:30:34.276116Z 0 [ERROR] [MY-010457] [Server] --initialize specified but the data directory has files in it. Aborting. 2024-09-19T06:30:34.276123Z 0 [ERROR] [MY-013236] [Server] The designated data directory /opt/homebrew/var/mysql/ is unusable. You can remove all files that the server added to it. 2024-09-19T06:30:34.276167Z 0 [ERROR] [MY-010119] [Server] Aborting 2024-09-19T06:30:34.278681Z 0 [System] [MY-015018] [Server] MySQL Server Initialization - end.
친절하게 데이터 디렉토리에 파일이 존재하기 때문에 중지되었다고 뜬다.
해당 디렉토리를 삭제해준다.→
rm -r /opt/homebrew/var/mysql
다시 재시작을 시도해보니 임시 root 비밀번호를 발급해주면서 서버 재설정에 성공했다.
인증생략 후 접속
→
mysqld --skip-grant-tables
새로 터미널을 열고 root로 접속해본다.
→
mysql -u root
접속에 성공했다.
비밀번호 재설정
MySQL Server 8.3.0 버전
→
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '새로운_비밀번호';
ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement
다음과 같은 오류를 만났다. 인증 생략 모드로 접속하면 비밀번호 변경이 안 되는 모양이다.
권한을 다시 로드해준다.
→
FLUSH PRIVILEGES;
그러고 나서 비밀번호 변경을 다시 시도하면 성공적으로 변경이 된다.
이젠 까먹지 않게 따로 어딘가에 기록을 해두고 접속을 해제하자.
→
EXIT;
MySQL 서버를 정상모드로 재시작
인증을 생략한 모드로 서버를 가동하면 보안상으로 위험할 수 있다.
서버를 정상 모드로 재시작하자.
brew services restart mysql
테스트
→
mysql -u root -p
접속에 성공했다!
4. 내일의 학습
- JVM 구성요소 별로 파헤치기
class loader subsystem
runtime data areas
- method area
- heap
- Program Counter (PC)
- Java stack
- native method stacks
execution engine
JNI (Java Native Interface)
- SQL 퀘스트 걷기반
- 3번 문제부터 풀기
- Java 문법 복습
참고자료
'TIL' 카테고리의 다른 글
[TIL] 2024-09-12 (1) | 2024.09.12 |
---|---|
[TIL] 2024-09-11 (0) | 2024.09.11 |
[내일배움캠프] 스타터 노트 (0) | 2024.09.11 |
[Socket.IO] ws과 socket.io의 차이점 (0) | 2024.02.01 |