나를 기록하다
article thumbnail
반응형

매일 공부하기로 다짐한 Network, 테코톡 1일 1영상 정리, 1일 1알고리즘과 나동빈님의 JSP 게시판 만들기 강좌를 보고 JSP 게시판 만들기 실습을 진행했다. 간략하게 핵심 위주로 오늘 학습한 내용을 정리하겠다.

 

데이터 링크 계층

이더넷, CSMA/CD

  • 이더넷: 랜에서 적용되는 규칙. 허브와 같은 장비에 연결된 컴퓨터와 데이터를 주고 받을 때 사용
  • CSMA/CD: Carrier Sense Multiple Access with Collision Detection(반송파 감지 다중 접속 및 충돌 탐지)
    • CS: Carrier Sense. 데이터를 보내려고 하는 컴퓨터가 케이블에 신호가 흐르고 있는지 확인
    • MA: Multiple Access. 케이블에 데이터가 흐르고 있지 않다면 데이터를 보내도 좋다
    • CD: Collision Detection. 충돌이 발생하고 있는지 확인
  • CSMA/CD는 효율이 좋지 않기에 현재는 스위치(switch) 장비 사용

이더넷: 목적지 이외의 컴퓨터는 데이터 무시


MAC 주소의 구조

  • MAC 주소: Media Access Control Address(물리 주소)의 약어. 중복되지 않도록 규칙이 명확하게 정해져 있다.
    48비트의 숫자로 구성되어 있고, 앞쪽 24비트는 랜카드를 만든 제조사 번호, 뒤쪽 24비트는 제조사가 랜 카드에 붙인 일련번호
  • 이더넷 헤더 구조

이더넷 헤더 구조

  • 프레임: 이더넷 헤더와 트레일러가 추가된 데이터. 네트워크를 통해 프레임 전송

프레임

  • MAC 주소를 통한 프레임 전송 과정
    1. 출발지, 목적지 MAC 주소를 이더넷 헤더에 담음
    2. 캡슐화(데이터에 이더넷 헤더와 트레일러 추가) - 프레임 생성
    3. 물리 계층에서 2번 과정을 통해 생성된 프레임 비트열을 전기 신호로 변환
    4. 네트워크를 통해 전송

허브에 연결된 컴퓨터의 MAC 주소

  • 스위치: 데이터 링크 계층에서 동작하고 레이어 2 스위치 또는 스위칭 허브라고 부름. 데이터 충돌을 방지
    • MAC 주소 학습 기능: 컴퓨터에서 목적지 MAC 주소가 추가된 프레임이라는 데이터가 전송되면 MAC 주소 테이블을 확인하고  출발지 MAC 주소가 등록되어 있지 않으면 MAC 주소를 포트에 함께 등록한다.
    • 플러딩(Flooding): MAC 주소 테이블에 MAC 주소가 등록되어 있지 않다면 허브와 같이 등록되어 있지 않은 포트 번호에 모두 전송된다.

플러딩과 필터링


데이터가 케이블에서 충돌하지 않는 구조

  • 전이중 통신 방식: 데이터 송수신을 동시에 통신하는 방식
  • 반이중 통신 방식: 회선 하나로 송신과 수신을 번갈아가면서 통신하는 방식

전이중 통신 방식(컴퓨터 간 직접 랜 케이블 연결)과 반이중 통신 방식(허브에 연결)

  • 스위치: 스위치는 충돌이 일어나지 않는 구조. 전이중 통신 방식으로 데이터 주고 받음.

스위치

  • 충돌 도메인: 충돌이 발생할 때 그영향이 미치는 범위.

충돌 도메인


OCP와 전략패턴

  • if-else문의 문제점
    1. 변경이나 확장이 될수록 코드가 복잡해짐.
    2. 리팩토링 시 점점 오래 걸림
    3. 실수로 추가하지 않고 누락하는 부분 생길 가능

즉 유지보수가 어려워진다.

 

  • OCP란? 개방폐쇄의 원칙
    소프트웨어 구성 요소(컴포넌트, 클래스, 모듈, 함수)는 확장에 대해서는 개방되어야 하지만 변경에 대해서는 폐쇄되어야 한다.
    기존의 코드를 변경하지 않으면서 기능을 추가할 수 있도록 설계가 되어야 한다.

 

  • 적용 방법
    1. 상속(is-a)
    2. 컴포지션(has-a)

상속같은 경우, 상위 클래스와 하위 클래스가 강력하게 밀접되어 있기 때문에 상위 클래스가 변경된다면 하위 클래스에도 강력하게 영향을 미침(깨지기 쉬운 상위 클래스 문제). 따라서 컴포지션을 더 추천한다.

 

  • 컴포지션 적용방법(3가지)
    1. 변경(확장)될 것과 변하지 않을 것을 엄격히 구분
    2. 이 두 모듈이 만나는 지점에 인터페이스를 정의
    3. 구현에 의존하기보다 정의한 인터페이스에 의존하도록 코드 작성

 

  • 전략패턴
    1. 디자인 패턴의 꽃
    2. 전략을 쉽게 바꿀 수 있도록 해주는 디자인 패턴
    3. 행위를 클래스로 캡슐화해 동적으로 행위를 자유롭게 바꿀 수 있게 해주는 패턴
    4. 새로운 기능의 추가가 기존의 코드에 영향을 미치지 못하게 하므로 OCP 만족

 

  • Context: 전략 패턴을 이용하는 역할을 수행. 필요에 따라 동적으로 구체적인 전략 변경
  • Strategy: 인터페이스나 추상 클래스로 외부에서 동일한 방식으로 알고리즘을 호출하는 방법 명시
  • ConcreateStrategy: 전략 패턴에서 명시한 알고리즘을 실제로 구현한 클래스

 

백준 14928 큰 수(BIG)

https://www.acmicpc.net/problem/14928

 

14928번: 큰 수 (BIG)

첫째 줄에 제연이가 가장 좋아하는 수 N이 주어진다. (N ≤ 101,000,000)

www.acmicpc.net

난이도가 브론즈 5인데 처음에 BigInteger을 사용해서 풀려고 하다가 엄청 헤맸다.

수많은 실패...

그래서 무작정 코드를 작성하는 것을 멈추고, 알고리즘을 생각하며 문제를 다시 풀었다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String input = br.readLine();
        long result = 0;

        // 문자열을 숫자로 변환 및 모듈로 연산을 사용하여 최적화
        for (int i = 0; i < input.length(); i++) {
            char digitChar = input.charAt(i);
            int digit = digitChar - '0'; // 문자를 숫자로 변환 ('0'을 빼주면 정수로 변환)

            // 현재 결과에 10을 곱하고 입력된 숫자를 더한 후 20000303으로 나눔
            result = (result * 10 + digit) % 20000303;
        }

        System.out.println(result);
    }
}

먼저 주어진 입력의 범위가 숫자형으로 받기에는 너무 크므로, 문자열로 입력을 받는다.

그 후, 입력의 크기만큼 반복문을 돌면서

charAt() 통해 반환된 char형의 각 자리 문자를 - '0'을 하여 숫자로 변환한다.

그리고 result = (result * 10 + digit) % 20000303; 이 과정을 반복하여 나머지를 구한다.

정답 코드만 보면 쉬운 문제였지만, 무턱대고 코드부터 작성하면 많이 헷갈릴 수 있는 문제였다.


JSP 게시판 만들기

https://www.youtube.com/watch?v=Bb7OZobUqwc&list=PLRx0vPvlEmdAZv_okJzox5wj2gG_fNh_6&index=15 

나동빈님의 강의를 보고 따라서 만들어봤다.

클론 코딩으로 했기에 딱히 블로그 포스팅이나 노션 등에 정리하면서 하진 않았다.

1강부터 15강까지 완강을 하였기에, 이제 스스로 JSP를 활용한 CRUD 게시판 만들기 미니 프로젝트를 진행해보려 한다.

공부를 시작할 때 JSP가 옛날 기술이고 SpringBoot와 JPA, Thymeleaf를 쓰면 되지 않나라는 생각을 한 적이 있었는데, 아무래도 현업에도 아직 JSP를 사용하는 업체들이 많다는 말을 들었고 JSP를 사용해보면서 느꼈던 불편함을 알고 더 발전된 기술을 사용한다면 그 편리함과 JSP의 어떤 부분이 대체되었는지 등에 대한 배경을 알 수 있을거라 생각했기에 JSP부터 해보려 한다.

 

테코톡을 보다가 들은 유머스러운 문구를 기억한다.

 

역사를 잊은 기술은 미래가 없다.

 

정확히 이 문구가 맞는지는 모르겠지만, 정말 인상 깊었다.

 

비전공자로 개발 공부를 시작한 나는 처음에 백엔드 개발자가 되려면 Java + Spring을 해야한다는 말을 들었다.

그래서 바로 Java와 Spring을 공부하였다.

 

하지만 공부를 하면서 깊게 들어갈수록 기초가 부족함을 느꼈다.

빨리 갈려고 하면 할수록 늪에 빠지는 기분이랄까?

 

이런 어려움을 겪고나서 느낀건, 취업을 위해 공부하는 과정이기에 이론에 너무 깊게 빠져서도 안되지만, 기초 이론은 꾸준히 공부해야 한다는 것이다.

그래서 앞으로 꾸준히 네트워크, 운영체제, 컴퓨터 구조, 자료구조 등 기초 CS 지식을 공부하면서 기초를 다지려 한다.

물론 이런 공부를 하는 주 목적인 개발, 프로젝트를 꾸준히 하면서 말이다.

 

오늘도 목표한 분량을 채우려 하다보니 시간이 늦었다.

이제 제대로 시작한 지 6개월이 되었다.

 

중간에 갈피를 못잡고 헤맨 시간이 많았지만 이제 어느정도 방향성을 깨달았다.

내년 안에 취업을 목표로 끝까지 달려보겠다.

 

 

 

반응형
profile

나를 기록하다

@prao

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...