공감하기
본문 바로가기
  • [!] Manual from the past has just arrived
TIL

[TIL] 2024-09-19

by Puilin 2024. 9. 19.

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에서 실행되는 모든 스레드가 공유한다.
      • 그 외 나머지 영역은 각 스레드마다 별도로 생성된다.
  • 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 비밀번호가 생각나지 않았던 문제

  • 비밀번호를 초기화 하는 방법

    1. mysql 서비스 종료

      brew services stop mysql

    2. 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 비밀번호를 발급해주면서 서버 재설정에 성공했다.

    3. 인증생략 후 접속

      mysqld --skip-grant-tables

      새로 터미널을 열고 root로 접속해본다.

      mysql -u root

      접속에 성공했다.

    4. 비밀번호 재설정

      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;

    5. MySQL 서버를 정상모드로 재시작

      인증을 생략한 모드로 서버를 가동하면 보안상으로 위험할 수 있다.

      서버를 정상 모드로 재시작하자.

      brew services restart mysql

    6. 테스트

      mysql -u root -p


      접속에 성공했다!

4. 내일의 학습

참고자료

  1. https://www.artima.com/insidejvm/ed2/jvm2.html
  2. https://datamoney.tistory.com/346

'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