Archive

2020-12-17 TIL

|

2020-12-17 TIL


  • 오늘 한 것
    1. 이것이 리눅스다 Chapter 11 데이터베이스 서버 구축과 운영 - Linux로 MariaDB를 설치하여 데이터베이스 서버를 구축하고 Client 컴퓨터로 접속하는데까지 성공했다. 써놓고 보니 아주 간단한 작업같지만…MariaDB를 dnf로 install 할 때부터 Error가 나서 한참 헤매다가 mariadb.org에서 설명을 보고 repo file을 만들어 환경세팅을 해주니 해결되었다.

    2. 학원 비대면 수업 (다형성,추상클래스,인터페이스) - 세 단원을 하루에 하나씩 해도 될만큼 큼지막한 장들인데 하루만에 저 세 단원을 모두 나갔다. 설명 들으랴 머리로 이해하랴… 나만 그런가 했지만 수업을 듣는 다른 친구들도 마찬가지인듯 보였다. 그래도 블로그 포스팅을 하면서 정리를 한 덕에 한 차례(?) 정리 할 수 있었다.

    3. 블로그 포스팅 (java day13 정리, Javascript Day 4, Linux/CentOS MariaDB) - Linux 포스팅을 하네마네 맨날 고민하다가 데이터베이스 부분은 중요할 것 같아서 나중에라도 기억을 되짚어보기 위해 포스팅하기로 했다. 책에 있는 내용이 대부분이지만 나중에 책볼래? 블로그 볼래? 하면 역시 내가 이해한대로 작성한 내 블로그를 볼 것 같다.

    4. Javascript30 Tutorial Day 27 - Click & Drah로 움직이는 가로 슬라이더를 구현했다. 이렇게 간단히 만들어지는 것이었다니 ! 물론 좀 더 자연스럽고 시각적으로 예쁜 작동은 조금 더 살이 붙어야겠지만 작동 원리는 알았다.


  • 내일 할 것
    1. 이것이 리눅스다 Chapter 11 완료
    2. Javascript30 Tutorial Day 28
    3. 학원 수업(15:30~22:00) 다형성
    4. 블로그 포스팅 (Java Day 14, Javascript Day 5)
    5. 쇼미더머니9 마지막회 본방 사수

  • 끝으로

자바스크립트만 하루 종일 공부하고 싶다. 자바… 도 물론 중요하지만 (중요할까?)🤔

오늘의 한 줄 총평 : 유단자가 되고 싶습니다


CentOS8 MariaDB 설치

|

CentOS8 MariaDB 설치


이것이 리눅스다 의 Chapter11 데이터베이스 서버 구축과 운영의 실습내용입니다.



이 실습에선 DBMS로 MariaDB를 사용한다. linux운영체제인 server컴퓨터로 접속하여 root 계정으로 로그인한 뒤 mariadb.org에 접속하자

MariaDB


download로 들어가면 최신버젼을 받을 수도 있지만 교재와 같은 실습환경을 위해 이 곳에 접속한다 (http://yum.mariadb.org/10.4/centos8-amd64/rpms/galera)

MariaDB down


이 곳에서 galera, mariadb client, mariadb common, mariadb server 총 4가지 파일을 다운받는다

download


다운로드 디렉토리로 이동하여 dnf 명령으로 다운받은 rpm패키지들을 설치하자

설치


systemctl start mariadb 입력하여 실행시켜준다

systemctl enable mariadb 입력하여 상시 가동

systemctl status mariadb 로 작동 상태를 확인해보자

작동확인


녹색 글씨로 acticve (running) 중이면 정상적으로 가동한 것이다

firewall-config 명령을 실행하여 방화벽 설정을 하자

탭을 ‘영구적’으로 돌리고 public영역의 서비스 항목에서 mysql을 찾아 체크해준다

방화벽설정


mysql을 입력하여 mairaDB [(none)]> 커서가 나오면 정상적으로 접속된 것!

정상작동


하지만 이렇게 간단하게? 누구든 접속이 가능한 것인가? 라는 의문이 든다

나는 MariaDB의 admin 계정인 root 사용자로 접속을 한 것이다

root 사용자는 중요하니깐 비밀번호 설정을 해야겠다

mysqladmin -u root password ‘xxxx’;로 xxxx부분에 원하는 비밀번호를 설정한다

mysql로 다시 접속을 하려고 하면 비밀번호 입력란이 나온다

지극히 1차원적이지만 나름 보안설정이 되었다..

이제 다른 client 컴퓨터로 server 컴퓨터의 MariaDB에 접속을 해보자

client 컴퓨터는 window 운영체제이다

여기에다가도 MariaDB를 다운받는다

window는 Setup 프로그램으로 간편하게 설치를 할 수 있는데 이 안에서 무엇을 설치할지 고를 수 있다

client 만 필요하고 나머지는 다 체크를 해제한다

setup


cmd창을 열고 mariadb가 설치된 경로로의 bin 디렉토리로 이동하여 mysql을 입력해보자

아까완 다르게 접속을 할 수가 없다

접속x


당연하지만 client컴퓨터에는 MariaDB의 client만 설치하고 server 등등은 설치를 하지 않았기때문

그러면 다시 server 컴퓨터의 MariaDB에 접속을 해보자

명령어는 mysql -h 서버호스트IP 혹은 이름 -u 사용자이름 -p 순이다

그럼 mysql -h 192.168.111.100 -u root -p가 되겠군

클라접속x


읭? 비밀번호까지 잘 쳤는데 접속이 안된다. 자세히보니 내 IP주소로는 접속을 할 수가 없다는 것.

위의 명령어에서 root 에는 사실 ‘root@내 IP주소’ 가 생략되어 있다

즉, server 컴퓨터에서 client 컴퓨터의 IP주소를 사용한 접속을 허가한 적이 없다는 것.

그럼 다시, server컴퓨터에서 client컴퓨터로 접속을 할 수 있도록 사용자를 만들어줘야겠네

우선 server 컴퓨터의 MariaDB에서 사용자를 조회해보자

use mysql;

select user, host from user where user not like ‘’;

(sql 언어에서는 뒤에 세미콜론을 붙여줘야한다)

사용자확인


mysql과 root 사용자가 있다. 기본으로 제공된 사용자들인데 그 말은 즉슨, 다른 사용자가 없다는것

client 컴퓨터 IP주소의 사용자를 만들어줄건데 여기서 중요한 것은 window는 동적 IP주소라서 재부팅 할때마다 IP주소가 바뀐다는 것이다. 흠

그럼 192.168.111.xxx로 시작하는 모든 IP를 허용하여 사용자를 생성하자

사용자생성


비밀번호 1234를 가진 winuser@192.168.111.xxx 사용자가 생성이 되었다

다시 사용자 조회를 해보자


잘 만들어졌다. 이제 winuser로 다시 server의 MariaDB에 접속을 해보자


Welcome!! 😁


참고자료


이것이 리눅스다

JS Day 4 객체

|

JS Day 4 객체


  1. 객체

    • {} 중괄호를 이용해 만드는 객체 안에는 ‘key : value’ 로 구성된 property를 넣을 수 있으며 key에는 문자형, value는 모든 자료형이 허용됨
    • delete 객체명.key; 로 property를 삭제 할 수 있음
    /*
    *	,로 이어준다
    *	key 값에 복수의 단어가 올 경우 ""로 묶어준다
    */
    const human = {
        name : "foo",
        age : 38,
        "thunder birds" : true
    }
    /*
    *	const로 선언한 객체도 값을 바꿀 수 있다
    *	띄어쓰기가 있는 복수 단어는 대괄호로 표기한다
    */
    human.age = 19;
    human["thunder birds"] = false;
    /*
    *	대괄호를 사용하면 유연한 코드 작성이 가능하다
    *	user.key로 하면 undefined를 출력한다
    */
    let key = "name";
    alert( user[key] ); //foo 출력
    


  2. 계산된 프로퍼티

    • key값을 대괄호로 감싸서 계산된 프로퍼티를 표현 할 수 있음
    const animal = prompt("어떤 동물이 있나요?", "rabbit");
       
    const zoo = {
        [animal] : 7
    };
       
    alert( `${zoo.rabbit}마리 있네요` ); // 7마리 있네요 출력
    


  3. 단축 프로퍼티

    • 변수를 받아와 value로 설정 할 때, key 와 이름이 같으면 생략이 가능함
    function makeUser(id, passwd) {
        return {
            id, 		// id : id 와 동일하다
            passwd
        };
    }
    const user = makeUser("limu3372", 3090);
    alert( `ID : ${user.id}, PASSWORD : ${user.passwd}` );
    


  4. in 연산자

    • 프로퍼티가 객체 안에 있는지 판별 할 때 in을 사용함
    • “key” in object; 와 같이 사용하며 true, false 값을 반환


  5. 향상된 for문

    • for문에서 ( ; ; )표기법 대신 (key in object)로 object안의 key값 동안 for문을 돌릴 수 있음
    • key 자리엔 다른 변수명 사용해도 되고 let i 등으로 선언한다
    let zoo = {
        rabbit : 7,
        giraffe : 4,
        fox : 3
    };
       
    for (let key in zoo) {
        console.log( key );		//key 출력
        console.log( zoo[key] );	//value 출력
    }
    //zoo 객체 안의 모든 프로퍼티가 출력된다
    




참고 자료


JAVASCRIPT.INFO

Java Day 13 다형성,추상클래스,인터페이스

|

Java Day 13 다형성,추상클래스,인터페이스


  1. 다형성

    • 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 하는 것
    • 부모 클래스 타입의 참조변수로 자식 클래스의 인스턴스를 참조
    • 이때 부모 클래스의 멤버와 메소드만 사용 할 수 있는데 자식클래스의 메소드가 오버라이딩 된 메소드라면 사용이 가능하다
    class Animal{
    	public String scream(){
            return "동물 울음소리";
        }
        public String eat(){
            return "먹이를 먹습니다";
        }
    }
    class Dog extends Animal{
        @Override
        public String scream(){
            return "왈왈";
        }
        public String bite(){
            return "사람을 뭅니다";
        }
    }
    public class Polymorphism{
        public static void main(String[] args){
            Animal dog = new Dog(); //타입 변환된 객체 생성
            System.out.println(dog.scream()); //"왈왈" 출력
            //System.out.println(dog.bite()); 컴파일에러, 오버라이딩된 메소드만 사용이 가능
            System.out.println(dog.eat()); //"먹이를 먹습니다" 출력, 부모의 메소드는 사용 가능
        }
    }
    


    • 다형성으로 만들어진 인스턴스가 자식 클래스의 메소드를 사용하고 싶으면 어떡할까?
    • 이때 메소드는 오버라이딩된 메소드가 아니라 자식만 가지고 있는 메소드이다
    • 다운 캐스팅은 다시 원래의 타입으로 형 변환하는 것을 말한다
    • 위의 코드에서 bite 메소드를 사용하기 위해선 Dog d = (Dog) dog 처럼 다운 캐스팅을 활용하여 형 변환을 해야한다. 이때 자식 클래스의 타입을 (Dog) 처럼 명시적으로 넣어야한다
  2. 추상 클래스

    • 추상화 작업이란 대상을 보고 공통적인 부분을 추려내어 추상적인 개념을 만드는 것이다
    • 추상 메소드를 하나라도 가지고 있는 클래스는 추상 클래스가 된다
    • 추상 메소드는 수행문이 없는 즉, body가 없는 메소드로 abstract 예약어로 명시한다
    • ex) abstract void example(); –> 중괄호가 없고 바로 세미콜론으로 끝난다
    • 추상 클래스는 객체를 생성 할 수 없다. 이때, 다형성을 이용해서 사용하며 메소드는 무조건 오버라이딩 해야한다.
    abstract class Diagram{ //추상 클래스
        abstract void draw(); //추상 메소드
    }
    class Triangle extends Diagram{
        @Override				//메소드 재정의
        void draw(){
            System.out.println("삼각형을 그린다");
        }
    }
    class Circle extends Diagram{
        @Override				//메소드 재정의
        void draw(){
            System.out.println("원을 그린다");
        }
    }
    public class UseDraw{
        public static void main(String[] args){
            Diagram[] ref = new Diagram[2];
            ref[0] = new Triangle();
            ref[1] = new Circle();
            for(int i=0; i<ref.length; i++)
                ref[i].draw();		//삼각형을 그린다, 원을 그린다 출력
        }
    }
    


  3. 인터페이스

    • 인터페이스는 말그대로 객체의 사용 방법을 정의한 타입이다
    • 물리적 구조는 class와 같지만 class 대신 interface로 선언한다
    • 일반적으로 상수와 추상메소드만 갖는다 (자바8부터 디폴트,정적 메소드도 가질 수 있음)
    • 일반 클래스에서 implements 예약어로 인터페이스를 사용한다
    • 인터페이스 간에는 다중 상속이 허용된다
    • 인터페이스를 구현한 일반 클래스에서 추상메소드를 모두 오버라이딩 해야한다
    public interface HumanDo { //편의상 한 화면에 나타내었지만 interface는 별개의 파일에 존재
        //상수
    	static final int MAX_HOURS = 10;
        static final int MIN_HOURS = 1;
        //추상 메소드 abstract는 자동으로 써준다
        void studying();
        void playing();
    }
    class Student implements HumanDo{
        @Override		//추상메소드 재정의
        public void studying() {
            System.out.println(HumanDo.MAX_HOURS+" 시간 공부!");
        }
        @Override		//추상메소드 재정의
        public void playing() {
            System.out.println(HumanDo.MIN_HOURS+" 시간 휴식..");
        }
    }
       
    public class StudentTest {
        public static void main(String[] args){
            Student student = new Student();
            student.studying();	//10시간 공부! 출력
            student.playing();	//1시간 휴식.. 출력
        }
    }
    




참고 자료


이것이자바다

자바프로그래밍100% 실전가이드

KG아이티뱅크 자바 강의자료

2020-12-16 TIL

|

2020-12-16 TIL


  • 오늘 한 것

    1. 이것이 리눅스다 Chapter 10 샌드메일 서버 설치,운영 - VMware 가상머신으로 sendmail을 설치하여 서버2대와 클라이언트 2대를 돌려서 메일을 주고 받는 실습을 했다. 가상이긴해도 실제로 메일이 보내지고 수신이 되었을때 오? 되네? 하고 신기했다. 회사의 사내메일도 이런 식으로 구성된 것일까?🧐

    2. 학원 비대면 수업 (상속) - this()와 super() 등 헷갈렸던 개념이 이해가 되었다. 메소드나 클래스에 final을 선언하는 것은 이해는 했는데 이게 언제 쓰일지에 대해서는 규모있는 프로젝트를 경험해본적이 없는 나로서는 감이 오질 않는다. 이 부분은 조금 더 고찰이 필요할 것 같다.

      참고 : 자바의 final은 언제 사용할까?

    3. 블로그 포스팅 (java day12 정리, Javascript Day 3) - ‘자바스크립트는 동적 언어’라는 말답게 다른 언어와는 다르게 쓰이는 것들이 참 많다. 이렇게 기본을 먼저 공부하길 잘했다는 생각이 든다. 무작정 클론코딩을 할 때는 잘 이해가 안가서 지나쳤던 부분들이 차근차근 공부하면서 정리가 되고 있다.😙

    4. Javascript30 Tutorial Day 26 - nav에 dropdown된 content 영역의 크기에 맞춰 background 영역의 크기가 바뀌는 nav를 구현하였다


  • 내일 할 것
    1. 이것이 리눅스다 Chapter 10 메일 서버 설치와 운영 완료
    2. Javascript30 Tutorial Day 27
    3. 학원 수업(15:30~22:00) 다형성
    4. 블로그 포스팅 (Java Day 13, Javascript Day 4)

  • 끝으로

날로 배워서 붕붕 떠다녔던 퍼즐들이 하나씩 맞춰지는 느낌?

오늘의 한 줄 총평 : 탄탄탄탄탄한 기초를 쌓자