https://www.cdnetworks.com/ko/cloud-security-blog/web-application-firewall-waf/

'TIL' 카테고리의 다른 글

Kubelet, Kubectl, Ingress 가뭐냐  (0) 2024.02.14
2024.01.31 쿠버네티스 공부  (2) 2024.01.31
SVN vs Git  (1) 2022.12.11
JPA fetchType (EAGER, LAZY)  (0) 2022.12.06
디자인패턴 - 컴포지트 패턴 (Composite Pattern)  (0) 2022.11.12

SVN, Git 차이

일단 공통점은?

  • 둘 다 형상관리 툴이다.

형상관리란?

  • 영어로 Version Control Revision Control
  • 소프트웨어의 버전관리를 뜻함.
  • 소스코드의 변화를 관리하는 것.

그게 왜 필요한지?

  • 소스를 버전 별로 관리할 수 있음
  • 그래서 소스가 삭제되거나, 수정되었을 때 그리고 과거 버전으로 복구하고 싶을 때 유용함.
  • 여럿이서 개발을 하는 경우, 누가 어느 부분을 수정했는지 관리가 됨.
  • 그래서 코드 병합, 코드 리뷰를 할 때 용이함.

형상관리 툴의 종류

  • Client/Server 타입
    • Subversion(SVN), CVS, Perforce, ClearCase, TFS
  • 분산저장소 타입
    • Git,. Mercurial, Bitkeeper, SVK, Darcs
  • Folder 공유 타입
    • RCS, SCCS

차이점

  1. SVN은 중앙서버를 이용해 소스코드를 보관, Git은 여러 분산 서버와 PC 로컬저장소를 통해 소스코드를 보관
    • SVN에선 Commit을 하면 바로 서버와 연동됨.
    • Git에선 Commit을 하더라도 push 하기 전까지는 서버에 영향을 미치지 않음
    • 그래서 commit을 할 때 더욱 신중해야 하는 것은 SVN이다.
    • 사본을 로컬에서 관리하는 Git은 SVN보다 소스코드에 더 빨리 접근할 수 있음.

  1. SVN은 version history를 가지지 않으나, Git은 가짐.
    • 그래도 SVN에서도 몇 일 전까지의 history는 확인 가능.
    • 그러나 확인만 가능. 그것을 다시 복구하거나 하는 행위 불가능
    • Git은 원하는 순간에 history를 통해 이전 소스코드를 보거나, 이용할 수 있음

  1. Git이 SVN보다 더 빠르고, 많은 기능을 가지는 것처럼 보임.
    • 그래서 Git이 SVN보다 좀 더 사용하기 힘듬.
    • 이용하기 위해 공부가 더 필요한 것은 Git 이다.

reference

https://hahahoho5915.tistory.com/40

JPA FetchType

서로의 Entity가 N:1 매핑이 되어있는 상태에서 fetch 설정을 할 수 있음

  • @??ToOne 상황에서는 EAGER 이 디폴트 값
  • @??ToMany 상황에서는 LAZY 가 디폴트 값

FetchType.LAZY

  • 지연로딩
  • JPA는 필요한 값만 딱 가져오기 위해 필요한 쿼리만 보냄.

FetchType.EAGER

  • 즉시로딩
  • JPA는 필요하지 않든 어쨌든 일단 연관된 테이블의 모든 값에 대한 쿼리를 보내서 가져와놓고 생각함.
  • n+1 문제를 발생시킬 수 있으므로 EAGER은 가급적이면 쓰지 않는게 좋다.

정리

  • 비지니스 로직에서 Over fetching과 같은 현상, 그리고 불필요한 쿼리 요청은 로직의 효율성을 떨어뜨린다.
  • EAGER(즉시로딩)을 사용하면 Over fetching 현상을 발생시킬 수 있음.
  • 또한 연관된 테이블의 갯수만큼 계속 select 요청을 보내는 n+1 문제를 야기시키기도 함.
  • 따라서 FetchType은 LAZY를 쓰는 것을 권장한다.
    • (FetchType LAZY를 사용한다고 해서 반드시 n+1 문제가 해결되는 것은 아님)

Reference:

https://ict-nroo.tistory.com/132

https://developer-hm.tistory.com/37

디자인 패턴 - 컴포지트 패턴 (Composite Pattern)

  • Composite 란 영어사전상 "복합체" 라는 뜻.
  • 소프트웨어적으로는 하나 이상의 유사한 객체를 구성으로 설계된 객체로서, 모두 유사한 기능을 나타내는 것을 뜻한다.
  • 즉, 객체 그룹을 조작하는 것처럼 단일 객체를 조작할 수 있음.

  • 컴포지트 패턴은 클라이언트가 복합 객체나 단일 객체를 동일하게 취급하는 것을 목적으로 함.
  • 이 때, 컴포지트의 의도는 "트리 구조"로 작성하여, 전체-부분(whole-part) 관계를 표현하는 것이다.
  • 즉, 전체-부분 관계를 효율적으로 정의할 때 컴포지트 패턴은 유용하다.

  • Composite 패턴에는 3가지로 구조가 나뉘어져있다.
    1. Component
      • 구체적인 부분
      • Leaf 클래스와 Composite 클래스의 공통 인터페이스임
    2. Leaf
      • 구체적인 부분 클래스
      • Composite 객체의 부품
    3. Composite
      • 전체 클래스.
      • 여러개의 Component를 갖도록 정의한다.
      • 그래서 여러개의 Leaf, 여러개의 Composite를 부분으로 가질수도 있다.

예시

  • 강아지와 고양이는 동물이다.
  • 강아지그룹, 고양이그룹에 각각 2마리, 3마리 넣는다.
  • 두 그룹을 동물원에 넣는다.
  • 동물원 내의 동물들을 모두 speak 하게 만들면?

Component: IAnimal.java

// Component 역할
interface IAnimal {
    public void speak();
}

Leaf: Cat.java

public class Cat implements IAnimal{
    @Override
    public void speak() {
        System.out.println("야옹");
    }
}

Leaf: Dog.java

public class Dog implements IAnimal{
    @Override
    public void speak() {
        System.out.println("멍멍");
    }
}

Composite: AnimalGroup.java

// Composite 역할
public class AnimalGroup implements IAnimal {

    private List<IAnimal> animalGroup = new ArrayList<IAnimal>();

    public void speak() {
        for (IAnimal animal : animalGroup) {
            animal.speak();
        }
    }

    public void add(IAnimal animal) {
        animalGroup.add(animal);
    }

    public void remove(IAnimal animal) {
        animalGroup.remove(animal);
    }
}

Client: Main.java

public class Main {
    public static void main(String[] args) {

        // 강아지그룹, 고양이그룹 생성
        AnimalGroup dog_group = new AnimalGroup();
        AnimalGroup cat_group = new AnimalGroup();

        // 강아지 2마리, 고양이 3마리 만들어서 각 그룹에 넣기
        Dog dog1 = new Dog();
        Dog dog2 = new Dog();

        Cat cat1 = new Cat();
        Cat cat2 = new Cat();
        Cat cat3 = new Cat();

        dog_group.add(dog1);
        dog_group.add(dog2);

        cat_group.add(cat1);
        cat_group.add(cat2);
        cat_group.add(cat3);

        // 강아지그룹과 고양이그룹을 동물원이라는 그룹안에 넣겠음
        AnimalGroup zoo = new AnimalGroup();
        zoo.add(dog_group);
        zoo.add(cat_group);

        // 동물원의 모든 동물들을 speak 해보겠음
        zoo.speak();
    }
}

결과는 다음과 같이 나온다.

멍멍
멍멍
야옹
야옹
야옹

'TIL' 카테고리의 다른 글

SVN vs Git  (1) 2022.12.11
JPA fetchType (EAGER, LAZY)  (0) 2022.12.06
디자인패턴 - 프록시 패턴 (Proxy Pattern)  (0) 2022.11.08
프로그래머스 SQL 고득점 Kit 도장깨기  (0) 2022.10.29
URI, URL, URN 차이  (0) 2022.10.25

디자인 패턴 - 프록시 패턴 (Proxy Pattern)

  • Proxy는 우리말로 대리자, 대변인이라는 뜻이다.
  • Proxy는 흐름제어만 할 뿐, 결과값을 조작하거나, 변경시키면 안된다.

  • Proxy는 실제 서비스와 같은 이름의 메서드를 구현한다. 이 때 인터페이스를 사용한다.
  • Proxy는 실제 서비스에 대한 참조 변수를 갖는다.
  • Proxy는 실제 서비스의 같은 이름을 가진 메서드를 호출하고, 그 값을 클라이언트에 돌려준다.
  • Proxy는 실제 서비스의 메서드 호출 전후에도 별도의 로직을 수행할 수 있다.

예시

IService.java

public interface IService {
    String runSystem();
}

Service.java

public class Service implements IService {
    @Override
    public String runSystem() {
        return "시스템을 실행합니다."
    }
}

Proxy.java

public class Proxy implements IService {
    IService service1;

    @Override
    public String runSystem() {
        System.out.println("대신실행 하겠습니다.")
        service1 = new Service();
        return service1.runSystem();
    }
}

Main.java

public class Main {
    public static void main(String[] args) {
        IService proxy = new Proxy();
        System.out.println(proxy.runSystem());
    }
}

  • 인터페이스를 두어서 구체 클래스에 영향을 받지 않게 하였음.
  • Proxy를 통해 우회하여 접근하였다.
    • OCP, DIP 원칙이 녹아져있음을 알 수 있다.

Main.java 실행결과

image


https://school.programmers.co.kr/learn/challenges?tab=sql_practice_kit 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

코테를 볼때마다 얕은 SQL 지식때문에 뭔가 풀 수 있을 것 같은데 못푸는 경험을 자주 했다.

여러 예제들을 풀어보면서 SQL 문법과 함수들을 익히는 시간이 필요하다고 생각해서

일단 프로그래머스의 SQL 고득점 Kit부터 싹다 풀어봤다.

 

SELECT

과일로 만든 아이스크림 고르기

재구매가 일어난 상품과 회원 리스트 구하기

역순 정렬하기

아픈 동물 찾기

어린 동물 찾기

동물의 아이디와 이름

여러 기준으로 정렬하기

상위 n개 레코드

조건에 맞는 회원수 구하기

 

SUM, MAX, MIN

가장 비싼 상품 구하기

최댓값 구하기

최솟값 구하기

동물 수 구하기

중복 제거하기

 

GROUP BY

성분으로 구분한 아이스크림 총 주문량

고양이와 개는 몇 마리 있을까

동명 동물 수 찾기

년, 월, 성별 별 상품 구매 회원 수 구하기

입양 시각 구하기(2)

가격대 별 상품 개수 구하기

 

IS NULL

경기도에 위치한 식품창고 목록 출력하기

이름이 없는 동물의 아이디

이름이 있는 동물의 아이디

NULL 처리하기

나이 정보가 없는 회원 수 구하기

 

JOIN

그룹별 조건에 맞는 식당 목록 출력하기

없어진 기록 찾기

있었는데요 없었습니다

오랜 기간 보호한 동물(1)

보호소에서 중성화한 동물

상품 별 오프라인 매출 구하기

상품을 구매한 회원 비율 구하기

 

STRING, DATE

최소되지 않은 진료 예약 조회하기

루시와 엘라 찾기

이름에 el이 들어가는 동물 찾기

중성화 여부 파악하기

오랜 기간 보호한 동물(2)

카테고리 별 상품 개수 구하기

URI, URL, URN

URI (Uniform Resource Identifier)

  • 통합 자원 식별자
  • 인터넷 자원을 식별할 수 있는 문자열이다.
  • URI의 하위 개념으로 URL와 URN이 있는 것.
  • 구성 : :scheme: :hosts: :url-path: :query:
  • 예시1 : file://127.0.0.1/Users/username/Desktop
  • 예시2 : https://www.google.com:80/search?q=JavaScript
    • scheme
      • 가장 먼저 작성한다.
      • 통신 방식(프로토콜)을 결정한다
      • 일반적으로 웹 브라우저에서는 http(s)를 사용한다.
      • 예시: file:// , http:// , https://
    • hosts
      • 웹 서버의 이름, 도메인, IP를 사용하여 주소를 나타낸다.
      • port 번호를 hosts: 뒤에 입력할 수 있음.
      • 예시: 127.0.0.1 , www.google.com
    • url-path
      • 웹 서버에서 지정한 루트 디렉토리부터 시작하여
      • 웹 페이지, 이미지, 동영상 등이 위치한 경로와 파일명을 나타낸다.
      • 예시 : /search , /Users/username/Desktop
    • query
      • 웹 서버에 보내는 추가적인 질문이다.
      • 예시 : q=JavaScript

참고로, 예시 2번의 URI를 브라우저의 주소창에 입력하면 구글에서 JavaScript를 검색한 결과가 나타난다.


URL (Uniform Resource Locator)

  • 네트워크 상에서 웹페이지, 이미지, 동영상 등의 리소스 파일이 위치한 정보를 나타낸다.
  • URL은 FTP, SMTP처럼 다른 프로토콜에서도 사용할 수 있다. 아래는 예시.
  • 리소스를 표현하는 방법 중, REST API도 URL이다.

URN (Uniform Resource Name)

  • URI의 표준 포맷 중 하나이다.
  • 이름으로 리소스를 특정짓는 URI이다.
  • URN은 리소스를 영구적이고 유일하게 식별할 수 있는 URI이다.
  • 실제 리소스를 찾기 위해서는 URN을 URL로 변환하여 이용한다.
  • 예시
urn:oasis:names:specification:docbook:dtd:xml:4.1.2
tel:+1-816-123-1234

참고 이미지

referimage

정보 출처 : https://hanamon.kr/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EA%B8%B0%EB%B3%B8-url-uri-urn-%EC%B0%A8%EC%9D%B4%EC%A0%90/

디자인 패턴 - 퍼사드 패턴 (Facade Pattern)

  • Facade 라는 영어단어는 '(건물의) 정면' 이라는 뜻이다.
  • 어떤 소프트웨어의 다른 커다란 코드 부분에 대하여 간략화된 인터페이스를 제공하는 디자인패턴.
  • 간단하게 말하면 복잡한 소프트웨어를 사용할 수 있도록 간단한 인터페이스를 제공하는 것임.

실생활 예시

  • 집에서 영화를 보려면 해야할 일
    1. TV리모콘 준비
      1. 일어서서 리모콘 찾기
      2. 제자리로 돌아와서 앉기
    2. TV 키기
      1. 리모콘으로 TV 켜기
      2. 다 보고난 뒤 TV 끄기
    3. 영화 결제하기
      1. 볼만한 영화 탐색
      2. 영화 선택
      3. 결제 프로세스
    4. 음료 준비하기
      1. 일어서서 냉장고로 가기
      2. 컵을 꺼내서 음료 담기
      3. 제자리로 와서 앉아서 마시기
    5. 팝콘 준비하기
      1. 팝콘 가져오기
      2. 팝콘 개봉하기
    6. 시청

관련한 내용들을 Class로 작성할 수 있을 것. (일부 생략)


  • 리모콘 클래스
public class Remote_Control {
    public void Turn_On() {
        System.out.println("TV 키기");
    }
    public void Turn_Off() {
        System.out.println("TV 끄기");
    }
}
  • 영화 클래스
public class Movie {
    private String name = "";

    public Movie(String name) {
        this.name = name;
    }

    public void Search_Movie() {
        System.out.println(name + " 영화를 찾다");
    }

    public void Charge_Movie() {
        System.out.println("영화 결제");
    }

    public void Play_Movie() {
        System.out.println("영화 재생");
    }
}
  • 음료 클래스
public class Beverage {
    private String name = "";

    public Beverage(String name) {
        this.name = name;
    }

    public void Prepare() {
        System.out.println(name + "음료 준비 완료");
    }
}
  • 되게 복잡하나, 우리가 하고싶은건 결국 영화를 보는 것
public class Facade {
    private String beverage_name = "";
    private String movie_name = "";

    public Facade(String beverage_name, String movie_name) {
        this.beverage_name = beverage_name;
        this.movie_name = movie_name;
    }

    public void View_Movie() {
        Beverage beverage = new Beverage(beverage_name);
        Remote_Control remote = new Remote_Control();
        Movie movie = new Movie(movie_name);

        beverage.Prepare();
        remote.Turn_On();
        movie.Search.Movie();
        movie.Charge_Movie();
        movie.Play_Movie();
    }
}
  • Facade 클래스 내에 영화를 보기 위한 프로세스를 다 담았음.
  • 클라이언트는 어벤져스를 보면서 콜라를 먹기 위한 행동으로 다음의 간단한 코드만 이용하면 된다.
public class Facade {
    public void view() {
        Facade facade = new Facade("Coke", "Avengers");
        facade.View_Movie();
    }
}

정보 출처 : https://lktprogrammer.tistory.com/42

+ Recent posts