TIL(Today I Learned) (62)

 

 

 

 

❑ Architecture (아키텍처)

 

 

➤ 아키텍처란?

 

▶️ Architecture?

아키텍처는 건축 분야에서 유래된 용어로 건축물을 짓는데 있어 청사진 같은 역할을 한다.

쉽게 생각하면 건축의 조감도이다.

 

컴퓨터 시스템에서도 시스템을 만들기 전에 이해 당사자들이 모여서 시스템의 구조를 알기 쉬운 도형이나 이미지로 만들어놓는다.

 

 

 

➤ 컴퓨터 시스템에서 아키텍처 유형

 

▶️ 시스템 아키텍처

하드웨어 + 소프트웨어를 모두 포함하는 시스템의 전체적인 구성을 큰그림으로 표현한 것

시스템의 구성 및 동작원리를 나타낸다.

시스템의 구성요소에 대해 설계 및 구현을 지원하는 수준으로 자세히 기술

구성 요소 및 시스템 외부 환경과의 관계 묘사

요구 사양과 시스템의 전체 수명 주기를 고려

시스템의 전체적인 최적화가 목표

 

 

참고 사이트

https://www.edrawsoft.com/kr/program-review/architecture-drawing-program.html

 

아키텍처 구성도 쉽게 그리는 프로그램?

아키텍처란 건축학이라는 의미 외에도 컴퓨터를 기능면에서 본 구성 방식을 의미하기도 합니다. 아키텍처 구성도를 그리는 프로그램을 사용하여 간단한 아키텍처 구성도를 직접 그려보도록 하

www.edrawsoft.com

 

 

 

▶️ 소프트웨어 아키텍처

 

하드웨어를 제외한 컴퓨터 내의 모든 프로그램을 포괄하는 소프트웨어의 구성을 큰 그림으로 표현한 것

 

소프트웨어 아키텍처의 예시

Java 플랫폼 아키텍처

 

Java SE 아키텍처 (출처: https://docs.oracle.com/javase/1.5.0/docs/index.html)

 

 

▶️ 애플리케이션 아키텍처

 

애플리케이션은 소프트웨어의 종류 중 하나이다.

데스크탑이나 스마트폰에서 사용하는 응용 프로그램이다.

넓게는 클라이언트의 요청을 처리하는 서버 애플리케이션을 의미한다.

 

애플리케이션 아키텍처 중에 앞으로 자주 볼 웹 애플리케이션 아키텍처인 계층형 아키텍처(N-Tier) 정도는 기억해두자.

 

계층형 아키텍처

 

API 계층(API Layer)

클라이언트의 요청을 받아들이고 응답하는 계층

일반적으로 표현 계층(Presentation Layer)라고 불림

REST API를 제공하는 애플리케이션의 경우엔 API 계층이라고 표현한다.

 

 

서비스 계층(Service Layer)

API 계층에서 전달받은 요청을 업무 도메인의 요구 사항에 맞게 처리하는 계층

Domain(Business) 계층이라고도 불림

서비스의 핵심 로직이 포함되어 있음

API 계층에서 전달받은 데이터의 유효성(Validation) 검사

어떤 Data Access를 선택할지 결정

 

※ 도메인(Domain)이란?

애플리케이션 개발에서의 도메인은 비즈니스적인 어떤 업무 영역과 관련이 있다.

예를 들어 배달 주문 앱을 만들어야 할때 고객과, 음식점, 배달원, 카드사 또는 은행 등 배달 주문 앱을 구현하기 위해 필요한 업무들을 자세히 알아야 높은 퀄리티의 애플리케이션을 만들 수 있다.

도메인 지식(Domain Knowledge) 들을 서비스 계층에서 비즈니스 로직으로 구현해야 한다.

예시) 고객이 주문을 하는 과정, 주문 받은 음식을 음식점에 전달하는 과정, 배달 기사를 매칭하는 과정 등

 

 

데이터 액세스 계층(Data Access Layer)

서비스 계층에서 처리된 데이터를 데이터베이스같은 데이터 저장소에 저장하기 위한 계층

 

 

 

➤ 아키텍처로 보는 Spring Framework 모듈(Module) 구성

 

아래는 스프링에서 제공하는 기능들을 나타낸 그림이다.

 

Spring Framework 모듈 아키텍처 (출처: Spring Framework Reference)

 

Spring Framework에서는 약 20개의 모듈을 통해 다양한 기능을 제공

 

▶️ 모듈(Module) 이란?

Java에서 일반적으로 지원되는 여러가지 기능들을 목적에 맞게 그룹화하여 묶어 놓은 것

모듈은 Java의 패키지 단위로 묶여 있고, 이 패키지 안에는 관련 기능을 제공하기 위한 클래스들이 포함되어 있다.

일반적인 모듈은 재사용이 가능하도록 라이브러리 형태로 제공되는 경우가 많다.

 

 

 

❑ Spring Boot 란?

 

➤ Spring Boot 란 무엇일까?

 

Spring Framework는 enterprise 애플리케이션을 개발하기 위한 핵심 기능을 제공하는 Spring Project중 하나이다.

Spring의 복잡한 설정을 해결하기 위해 나온 것이 Spring Boot이다.

 

 

➤ Spring Boot를 사용해야하는 이유?

 

1. XML 기반의 복잡한 설계 방식 지양

2. 의존 라이브러리의 자동 관리

3. 애플리케이션 설정의 자동 구성

4. 프로덕션급 애플리케이션의 손쉬운 빌드

5. 내장된 WAS를 통한 손쉬운 배포

 

지금은 아직 의미가 와닿게 이해되진 않지만 Spring을 계속 공부하다보면 언젠가 의미를 깨닫는 날이 오겠지..?

 

 

 

※ 심화학습

 

아파치 톰캣(Apache Tomcat) 이외에 Spring Boot에서 사용할 수 있는 서블릿 컨테이너(WAS)에는 어떤 것들이 있을까?

 

▶️ Tomcat

자바에서 가장 널리 사용되는 WAS

Spring Boot에서 기본 내장된 WAS

 

▶️ Jetty (추억의 제티 음료가 생각난다..)

경량 WAS이다.

적은 메모리를 사용하고 속도도 빠르지만

그만큼 대규모 트래픽엔 취약하다.

 

▶️ Undertow

유연한 고성능 웹서버

대규모 트래픽으로부터 톰캣보다 안정적

 

▶️ Netty (얘는 뭘까 Jetty 친구인가..?)

 

 

 

 

읽어주셔서 감사합니다 🤗

스프링 어려운데.. 동기분들 모두 힘내세요..!

오개념에 대한 지적은 언제나 환영입니다~

 

 

 

프로그램을 짤 때 좋은 코드인지 볼 수 있는 척도 중 하나

느슨한 결합도 높은 응집도

 

오늘은 어제 다 못한 스프링 트라이앵글을 마저 학습했다.

오늘 학습한건 AOP와 PSA이다.

Spring 삼각형

 

 

❑ AOP(Aspect Oriented Programming)

 

 

➤ AOP란?

 

번역하면 관심지향 프로그래밍

객체 지향은 알겠는데 관심지향 프로그래밍에서 관심은 무엇을 의미할까?

 

고양이를 키우는 집사들은 다 다른 방식으로 키운다.

어떤 집사는 고양이에게 좋은 음수대를 사주고 또 어떤 집사는 비싼 캣타워를 사준다.

이렇게 집사들의 고양이 키우는 방식은 다 다르지만 모두 공통적으로 고양이의 행복을 바란다.

집사들이 고양이의 행복이라는 공통 관심사를 가지고 있는 것처럼 AOP에서 'Aspect'는 애플리케이션에 필요한 기능 중에서 공통적으로 적용되는 기능에 대한 관심이다.

 

 

➤ 공통 관심사항과 핵심 관심사항

 

AOP에서 관심사항에는 공통 관심사항핵심 관심사항이 있다.

공통 관심사항 : 애플리케이션 전반에 걸쳐 공통적으로 사용하는 기능들에 대한 관심사

핵심 관심사항 : 비즈니스 로직, 애플리케이션의 주 목적을 달성하기 위한 핵심 로직에 대한 관심사

핵심 관심사항과 반대되는 의미에서 공통 관심사항을 부가 관심사항이라고 부르기도 한다.

 

예를 들어서 음식을 주문하는 애플리케이션을 만든다고 했을 때

핵심 기능에는 음식 선택, 계산, 주문 취소가 들어갈 수 있고

공통적으로 들어가는 기능에는 로깅, 보안, 트랜잭션이 있다.

관심사 예시

 

공통 관심사와 핵심 관심사를 그림으로 그려보면 위와 같이 그려진다.

핵심기능과 부가기능은 떨어져 있고 부가기능들이 핵심기능을 관통한다.

결론적으로 AOP는 애플리케이션을 만들 때 핵심기능 로직에서 공통기능 로직을 분리해서 따로 작성하는 것이다.

 

 

 

➤ 왜 AOP가 필요할까?

 

핵심 로직과 공통 로직을 분리하면 다음과 같은 장점이 있다.

  • 코드가 간결해진다
  • 객체 지향적으로 설계할 수 있다
  • 코드를 재사용하기 쉽다

 

 

※ AOP의 예시로 학습자료에 있던 JDBC 트랜잭션에서 중요한 부분을 정리해보았다.

트랜잭션(Transaction) : 데이터를 처리하는 하나의 작업 단위

같은 트랜잭션 내에 있는 기능 중 하나라도 오류를 발생하면 모든 작업은 취소된다. (All or Nothing)

모든 작업이 정상적으로 수행되어야만 정상적으로 반영한다. (commit)

하나의 작업이라도 실패하면 모든 작업을 롤백(rollback) 시킨다.

 

 

 

 

❑ PSA(Portable Service Abstraction)

 

 

➤ 추상화(Abstraction)의 개념

 

어떤 클래스의 본질적인 특성만을 추출해서 일반화 하는것을 추상화라고 한다.

설계의 관점에서는 추상화보다 일반화가 적절한 용어이다.

자바에서 추상화의 대표적인 방법이 인터페이스(Interface) 이다.

 

클라이언트가 추상화된 상위 클래스를 일관적으로 바라보며 하위 클래스들의 기능을 사용하는 것이 일관된 서비스 추상화(PSA)이다.

여기서 클라이언트의 영역에 대해서 조금 생각해보자.

서버/클라이언트에서 클라이언트는 서버측의 기능을 이용하는 입장이다.

대표적인 클라이언트는 웹 브라우저이다.

하지만 코드 레벨에서 어떤 클래스의 기능을 사용하는 측 역시 클라이언트라고 부른다.

 

 

➤ 서비스에 적용되는 일관된 서비스 추상화(PSA) 기법

 

예시로 java 콘솔 애플리케이션에서 클라이언트가 데이터베이스에 연결하기 위해서는 JdbcConnector라는 기능을 사용하려고 한다.

JdbcConnector는 애플리케이션에서 사용하는 서비스 중 하나라고 생각하면 된다.

데이터베이스에 연결하기 위한 JDBC 인터페이스의 구현체는 OracleJdbcConnector, MariaDBJdbcConnector, SQLiteJdbcConnector가 있다.

이때 클라이언트가 JDBC의 구현체에 바로 연결하는 것이 아닌 JdbcConnector 인터페이스를 통해 간접적으로 연결되어 느슨한 결합으로 연결되어 있다.

어떤 JdbcConnector를 이용해도 JDBC에 작성되어 있는 공통기능을 일관된 방식으로 사용할 수 있다.

기능이 작동하는 방식은 각각의 JDBC를 구현한 객체에 작성되어 있는데로 작동한다.

 

이처럼 애플리케이션에서 서비스의 기능을 접근하는 방식 자체를 일관되게 유지하면서 기술을 유연하게 사용할 수 있도록 하는 것을  PSA(일관된 서비스 추상화)라고 한다.

 

 

➤ PSA가 필요한 이유

 

어떤 서비스를 이용하기 위한 접근 방식을 일관된 방식으로 유지해서

애플리케이션에서 사용하는 기술이 변경되더라도 최소한의 변경만으로 변경된 요구사항을 반영하기 위해서이다.

 

PSA를 통해서 애플리케이션의 요구 사항 변경에 유연하게 대처할 수 있다.

 

Spring에서 PSA가 적용되는 분야로는 트랜잭션 서비스, 메일 서비스,  Spring Data 서비스 등이 있다.

 

 

 

 

 

읽어주셔서 감사합니다. 🥰 좋은하루 되시길 바랍니다.

오개념에 대한 지적은 늘 환영입니다. ^^

 

 

 

Spring 삼각형

 

 

Spring 삼각형

 

위의 Spring 삼각형 그림은 Spring의 핵심 개념들을 모두 표현한 모형이다.

 

POJO는 다른 핵심 개념들에 둘러 싸여져 있다.

POJO는 Ioc/DI, AOP, PSA를 통해서 달성할 수 있다는 것을 의미한다.

 

 

 

❑ POJO(Plain Old Java Object)

 

➤ POJO란?

JO’는 java object라는 뜻이다.

자바는 객체 끼리 관계를 맺을 수 밖에 없는 객체 지향 프로그래밍이다.

그렇다면 ‘PO’는 무엇일까?

P’는 plain 이란 의미다.

플레인은 보통 아무것도 들어가지 않은 순수한 상태를 의미한다. (플레인 요거트를 떠올려보자)

따라서 POJO는 자바로 생성하는 순수한 객체를 의미한다.

 

➤ POJO 프로그래밍이란?

POJO를 이용해서 프로그래밍 코드를 작성하는 것

그러나 단순히 순수한 자바 객체를 사용해서 코드를 작성한다고해서 POJO 프로그래밍이라고 볼 수는 없다.

 

※ 아래의 두가지 규칙을 지켜야 POJO 프로그래밍 이라고 부를 수 있다.

1. Java나 Java의 스펙(사양)에 정의된 것 이외에는 다른 기술이나 규약에 얽매이지 않아야 한다.

특정 기술을 상속해서 코드를 작성하게 되면 나중에 애플리케이션의 요구사항이 변경되어 다른 기술로 변경하려면 클래스를 명시적으로 사용했던 부분을 전부 다 일일이 제거하거나 수정해야한다.

 

2. 특정 환경에 종속적이지 않아야 한다.

 

 

➤ POJO 프로그래밍이 필요한 이유

  • 특정 환경이나 기술에 종속적이지 않으면 재사용 가능하고, 확장 가능한 유연한 코드를 작성할 수 있다.
  • 저수준 레벨의 기술과 환경에 종속적인 코드를 애플리케이션 코드에서 제거함으로써 코드가 깔끔해진다.
  • 코드가 깔끔해지기 때문에 디버깅하기도 상대적으로 쉽다.
  • 특정 기술이나 환경에 종속적이지 않기 때문에 테스트가 단순해진다.
  • 객체지향적인 설계를 제한없이 적용할 수 있다.

 

 

 

➤ POJO와 Spring의 관계

 

Spring은 POJO 프로그래밍을 지향하는 Framework이다.

그리고 최대한 다른 환경이나 기술에 종속적이지 않도록 작성하기 위해 IoC/DI, AOP, PSA의 3가지 기술을 지원하고 있다.

 

애플리케이션 프로그래밍 코드를 작성할 때 항상 내가 작성한 코드가 객체지향스러운가에 대한 고민을 하는 습관을 가져야 한다. 

 

 

 

 

❑ IoC(Inversion Of Control)/DI(Depedency Injection)

 

Library는 애플리케이션 흐름의 주도권이 개발자에게 있고 Framework는 애플리케이션 흐름의 주도권이 Framework에 있다.

여기서 말하는 애플리케이션 흐름의 주도권뒤바뀐 것IoC(Inversion of Control)이라고 한다.

 

 

▶️ Java 콘솔 애플리케이션의 일반적인 제어권

순수 자바 코드만으로 콘솔에 메시지를 출력하는 프로그램을 만들었다고 가정해보자.

일반적으로 자바 콘솔 애플리케이션이 실행되면 main() 메소드가 가장먼저 호출된다.

그리고 순서대로 System 클래스를 통해서 static 멤버 변수인 out의 println()이 호출된다.

이렇게 개발자가 작성한 코드를 순차적으로 실행하는게 일반적인 애플리케이션의 제어 흐름이다.

 

 

▶️ Java 웹 애플리케이션에서 IoC가 적용된다면?

 

서블릿 컨테이너의 서블릿 호출 모형

 

웹에서 동작하는 애플리케이션의 경우 클라이언트가 외부에서 접속해서 사용하는 서비스이기 때문에 main() 메서드가 종료되지 않아야 한다.

그런데 서블릿 컨테이너에는 서블릿 사양에 맞게 작성된 서블릿 클래스만 존재하고 별도의 main()메서드는 존재하지 않는다.

main()메서드처럼 애플리케이션의 시작되는 지점엔트리 포인트(Entry point)라고 부른다.

main()메서드가 없이 어떻게 애플리케이션이 실행되는 것일까?

클라이언트의 요청이 들어올 때마다 서블릿 컨테이너 내의 컨테이너 로직(service() 메서드)이 서블릿을 직접 실행시켜주기 때문에 main()메서드가 필요없는 것이다.

서블릿 컨테이너가 서블릿을 제어하고 있기 때문에 애플리케이션의 주도권은 서블릿 컨테이너에 있다.

여기서 서블릿과 웹 애플리케이션 간에 IoC의 개념이 적용되어 있는 것이다.

 

그렇다면 Spring에는 IoC의 개념이 어떻게 적용되어 있을까?

Spring에서 IoC는 DI(Dependency Injection)을 통해 적용된다.

 

 

 

➤ DI(Dependency Injection)란?

 

IoC 개념을 조금 더 구체화 시킨 것

Depencency는 ‘의존하는, 종속하는’ 이라는 의미이고 injection은 ‘주입’이라는 의미이다.

따라서 DI는 직역하면 '의존성 주입' 이라는 뜻이다.

 

 

 

▶️ 의존성 주입은 무엇일까?

 

객체지향프로그래밍에서 의존성은 대부분 객체 간의 의존성을 의미한다.

예를 들어 A, B의 두개의 클래스가 있다.

A클래스가 B클래스를 호출하는 다이어그램

A클래스는 B클래스 내부의 메서드를 호출하여 사용하도록 작성하였다.

이 때 ‘A클래스는 B클래스에 의존한다’라고 한다.

쉽게 말해 ‘A 클래스의 프로그래밍 로직 완성을 위해 B클래스에 도움을 요청한다’ 고 볼 수 있다.

 

※ 다이어그램

클래스간의 관계를 나타내는 다이어그램은 애플리케이션 설계를 위해 자주 사용된다. (애플리케이션 설계에 있어 중요한 역할!)

도구 : VisualParadigm

 

 

A클래스가 B클래스를 의존하는 관계를 코드로 작성해보았다.

public class EnergyController {
    public static void main(String[] args) {
        MonsterDrink monsterDrink = new MonsterDrink();
        int energy = monsterDrink.getCaffeine();
    }
}
public class MonsterDrink {
    public int getCaffeine() {
        return 10;
    }
}

 

위 코드에서 EnergyController 클래스는 클라이언트로부터 요청을 받는 엔드포인트(Endpoint) 역할을 한다.

그리고 MonsterDrink 클래스는 EnergyController 클래스가 전달받은 클라이언트의 요청을 처리하는 역할을 한다.

클라이언트 측면에서 서버의 엔드포인트란 클라이언트가 서버의 자원(리소스)를 이용하기 위한 끝 지점을 의미한다.

 

EnergyController에서 에너지드링크인 MonsterDrink 객체를 생성한 후 MonsterDrink의 getCaffeine() 메소드를 호출하고 있다.

이처럼 객체를 생성해서 참조하게 되면 의존 관계가 성립하게 된다.

 

 

그러나 두 클래스간의 의존 관계가 성립됐지만 아직 의존성 주입은 이루어지지 않았다.

의존성 주입을 하기 위해 코드를 수정해보자.

 

public class EnergyController {
    public static void main(String[] args) {
        MonsterDrink monsterDrink = new MonsterDrink();
        PresentEnergy presentEnergy = new PresentEnergy(monsterDrink);
        int energy = monsterDrink.getCaffeine();
    }
}
public class MonsterDrink {
    public int getCaffeine() {
        return 10;
    }
}
public class PresentEnergy {
    private MonsterDrink monster;
    public PresentEnergy(MonsterDrink monster) {
        this.monster = monster;
    }
}

 

의존성 주입은 생성자를 통해서 어떤 클래스의 객체를 전달 받는 것이다.

생성자의 매개변수로 객체를 전달하는 것을 외부에서 객체를 주입한다고 표현하는 것이다.

그렇다면 여기서 외부는 어디일까?

객체를 매개변수로 전달하고 있는 클래스가 외부이다.

 

클래스의 생성자로 객체를 전달받는 코드가 있다면 객체를 외부에서 주입받고 있어서 의존성 주입이 이루어지고 있다고 볼 수 있다

 

 

 

▶️ 왜 의존성 주입이 필요한가?

 

자바에서 생성자를 통해 객체를 전달하는 일은 아주 흔한 일이다.

하지만 의존성 주입을 사용할 때 클래스 내부에서 외부 클래스의 객체를 생성하기 위한 new 키워드를 사용을 지양해야 한다.

객체를 생성할 땐 당연히 new 키워드를 쓰지만 *Reflection이라는 기법을 이용해서 Runtime시에 동적으로 생성할 수 있는 방법이 있다.

new 키워드를 사용해서 의존 객체를 생성할 때, 클래스들 간의 강하게 결합(Tight Coupling)되어 있다고 한다.

하지만 자주 변경하려면 클래스들 간의 강한 결합은 피하는 것이 시간을 절약할 수 있다.

따라서 강한 결합보다는 느슨한 결합(Loose Coupling)을 사용하는 것이 좋다.

애플리케이션의 요구사항은 언제나 바뀔 수 있기 때문에 코드를 작성할 때 이부분을 고려하는 것이 좋다.

 

 

▶️ 느슨한 의존성 주입은 어떻게 할까?

 

클래스 간의 관계를 느슨하게 하는 대표적인 방법은 바로 인터페이스(Interface)를 사용하는 것이다.

어떤 클래스가 인터페이스 같이 일반화된 구성 요소에 의존하고 있을 때, 클래스들 간의 느슨하게 결합되어 있다고 한다.

예시로 작성했던 코드는 전달할 객체를 생성할 때 new 연산자를 사용했기 때문에 강하게 결합되어 있다.

그런데 여기서 에너지드링크를 monster가 아닌 hotsix로 바꾼다고 하면 코드를 수정할 부분이 많아진다.

하지만 monster와 hotsix의 일반적인 개념인 EnergyDrink라는 인터페이스를 만들어서 monster를 사용한 부분에 EnergyDrink를 작성한다면 어떨까?

moster와 hotsix 중 전달하고 싶은것을 생성할 때 작성하기만 하고 나머지는 수정하지 않아도 된다.

위의 내용을 코드로 구현하면 아래와 같다.

 

public class EnergyController {
    public static void main(String[] args) {
        EnergyDrink energyDrink = new MonsterDrink();
        PresentEnergy presentEnergy = new PresentEnergy(energyDrink);
        int energy = energyDrink.getCaffeine();
    }
}
public interface EnergyDrink {
    public int getCaffeine();
}
public class MonsterDrink implements EnergyDrink {
    @Override
    public int getCaffeine() {
        return 10;
    }
}
public class Hotsix implements EnergyDrink {
    @Override
    public int getCaffeine() {
        return 7;
    }
}
public class PresentEnergy {
    private EnergyDrink energyDrink;
    public PresentEnergy(EnergyDrink energyDrink) {
        this.energyDrink = energyDrink;
    }
}

 

하지만 여전히 EnergyController 클래스 내에서 객체를 생성할 때 new 연산자를 사용하고 있다.

여기서 이 new 연산자는 어떻게 없앨 수 있을까?

 

 

▶️ Spring 에서 의존성 주입을 누가 해주는가?

 

Spring에서 new 키워드로 객체를 생성하지 않고 Spring이 그 역할을 대신 할 수 있다.

new 키워드를 없애려면 Config라는 클래스를 이용하면 된다.

Config에 대해선 차후에 자세히 학습할 예정이기 때문에 지금은 어떤 역할인지만 기억하고 넘어가자.

Config클래스는 객체 생성을 미리 정의해 둔다.

그래서 Spring의 도움을 받아 new 키워드 마저도 없앨 수 있다!

하지만 Config클래스 객체를 new 키워드로 생성한거면 이것도 문제이지 않을까??

아니다. Config 클래스는 단순한 클래스가 아니라 Spring Framework의 영역에 해당하는 것이고 Config 클래스가 실제 애플리케이션의 핵심 로직에 관여하지 않고 있기 때문에 문제가 되지 않는다.

 

Spring 기반의 애플리케이션에서는 Spring이 의존 객체들을 주입해주기 때문에 애플리케이션 코드를 유연하게 구성할 수 있다.

 

 

 

더 공부가 필요한 내용

  • Java Reflection
  • Config

 

 

 

 

 

 

❑ Spring Framework 들어가기전

 

지금까지 Java의 기본과 핵심을 배웠다.

Java의 기본문법만으로 어떤 소프트웨어를 만들 수 있을까?

지금까지 배운것으로는 콘솔 출력 프로그램 또는

Java GUI API인 AWTSwing을 사용한 데스크탑 애플리케이션을 만들 수 있을 것이다.

 

 

➤ AWT(Abstract Window Toolkit)

AWT (출처: 위키)

자바의 본 플랫폼에 의존하는 윈도, 그래픽스, 사용자 인터페이스 위젯 툴킷

GUI를 제공하는 표준 API인 자바 파운데이션 클래스(JFC)의 일부

AWT는 수많은 자바 ME(Java Platform Micro Edition, 임베디드를 위한 자바 플랫폼)를 위한 GUI툴킷이다.

 

 

➤ 스윙(Swing)

Swing (출처: 위키)

자바에서 GUI를 구현하기 위해 JDK에서 기본적으로 제공하는 개발 툴킷

선마이크로시스템즈의 자바기반클래스의 일부

기존에 발표되었던 AWT가 OS및 윈도 시스템의 자원을 그대로 제공하기 때문에 자바에서 지향하는 “Write Once, Run Everywhere(WORE)”를 구현하기 위해 각종 시스템에서 공통적으로 제공하는 버튼, 대화창 등만을 구현했다.

그래서 여러 환경에서 동일한 화면을 보여줄 수 있지만 대신 해당 시스템의 고유한 모습을 보여줄 수 없다.

 

 

 

 

❑ 스프링 실습 환경 구성

 

먼저 설정해야 하는 것들이 몇 가지 있다.

  1. JDK-11 설치
  2. 환경변수에 JAVA_HOME 설정
  3. IntelliJ Community Edition 설치

 

Spring Initializr 공식 사이트로 이동

https://start.spring.io/

원하는 Spring Boot 실행 환경과 필요한 모듈을 포함하는 템플릿 프로젝트를 생성해 준다.

 

Spring Boot 애플리케이션은 WAS 배포용인 War 파일 형태로 배포할 수 있지만, 일반적으로 Spring Boot 애플리케이션은 WAS를 내장하고 있는 Jar 파일 형태로 배포해서 실행한다.

 

 

스프링 != 스프링 부트

스프링 부트는 스프링을 잘 활용하기 위해 스프링에서 나온 프로젝트

 

Packaging : 개발한 코드를 빌드해서 하나의 결과물로 만들어 낸다

 

ADD DEPENDENCIES 에서 ‘Lombok’ 과 ’Spring Web’을 선택하고 GENERATE를 누른다.

그러면 zip 파일이 다운로드 된다.

다운로드한 zip 파일은 압축해제 한다.

그 다음에 intelliJ에서 Open으로 압축을 푼 프로젝트를 열면 된다.

 

 

 

 

❑ Spring Framework 소개

 

 

➤ Framework란?

 

Frame은 틀, 구조, 뼈대 등의 의미이다.

벽에 거는 액자를 프레임이라고 부르기도 한다.

자동차에서는 뼈대가 되는 강판을 프레임이라고 부른다.

이처럼 Frame은 어떤 대상의 큰 틀이나 외형적인 구조를 의미한다.

지금까지 배웠던 것 중에 Framework는 Collections Framework가 있다.

Collections Framework 안에 있는 Map, Set, List 등은 데이터를 저장하기 위해 자주 사용되는 자료구조를 바탕으로 자바에서 제공하는 클래스이다.

그렇다면 콜렉션에 왜 framework라는 말을 붙일까?

자바에서 framework, 틀 하면 제일 먼저 생각나는 것이 인터페이스(Interface)이다.

자바의 콜렉션은 Map, List, Set같은 인터페이스와 그 인터페이스를 구현한 구현체들의 집합이다.

이렇게 Framework는 프로그래밍을 하기 위한 기본적인 틀이나 구조를 제공한다.

그 외에도 프레임워크는 다양한 기능들을 제공한다.

개발하고자 하는 애플리케이션이 다른 애플리케이션과 통신하고 데이터를 데이터 저장소에 저장하는 등의 기능들도 프레임워크나 라이브러리에서 제공한다.

이를 통해 개발자는 애플리케이션의 핵심 로직을 개발하는 것에만 집중할 수 있도록 해준다.

 

 

➤ Framework 와 Library?

 

프레임워크와 라이브러리는 얼핏 보면 같은 개념이지만 차이점이 있다.

프레임워크와 라이브러리는 여러가지 필요한 기능들을 제공한다는 점에서는 비슷하지만 중요한 차이점이 바로 애플리케이션에 대한 제어권이다.

 

라이브러리는 애플리케이션 흐름의 주도권이 개발자에게 있다.

개발자가 짜 놓은 코드내에서 필요한 기능이 있으면 호출해서 자유롭게 사용이 가능하다.

 

이에 반해 프레임워크는 애플리케이션 흐름의 주도권이 개발자가 아닌 프레임워크에 있다.

프레임워크는 불러오면 코드 상에서 보이지 않는 상당히 많은 일들을 한다.

개발자가 메서드내에 코드를 작성해두면 스프링 프레임워크에서 개발자가 작성한 코드를 사용하여 애플리케이션의 흐름을 만들어낸다.

이것이 Spring Framework의 핵심개념 중 하나인 IoC(Inversion Of Control,  제어의 역전)이다.

 

 

 

 

❑ Spring Framework를 배워야 하는 이유

 

 

➤ Spring Framework란?

 

스프링 프레임워크는 Java 기반의 웹 애플리케이션을 개발하는데 필요한 프레임워크이다.

2004년 버전 1.0이 처음 릴리즈 된 이후로 Java 기반의 웹 애플리케이션을 개발하는데 있어 표준이라 해도 과언이 아닐만큼 대세가 되었다.

 

그런데 자바 기반의 웹 애플리케이션을 개발하기 위한 프레임워크는 스프링만 있는 것은 아니다. Apache Struts2, Apache Wicket, JSF(Java Server Faces), Grails 와 같은 자바 또는 JVM 기반의 웹 프레임워크들이 존재한다.

 

▶️ 그런데 왜 스프링 프레임워크가 각광받는 걸까?

대부분의 기업들이 기업용 Enterprise 시스템용 애플리케이션 개발에 있어 Framework를 선택할 때, 개발 생산성을 높이고 어떻게하면 유지보수를 더 용이하게 할 것인가에 많은 초점을 맞춘다. 스프링 프레임워크는 개발 생산성을 향상시키고 유지보수를 용이하게 해주고 그 이상도 달성할 수 있게 해준다.

*기업용 Enterprise 시스템 : 기업의 업무(조직의 업무, 고객을 위한 서비스 등)를 처리해주는 시스템, 대량의 사용자 요청을 처리해야 하기 때문에 서버의 자원 효율성, 보안성, 시스템의 안전성이나 확장성 등을 충분히 고려해서 시스템을 구축한다.

 

Spring Framework를 사용하는 이유는 이전의 기술들을 알아보면 이해할 수 있다.

 

➤ Spring Framework 이전의 기술들

 

▶️ JSP를 이용한 애플리케이션

JSP(Java server page)

백엔드/프론트엔드의 구분없이 코드에 html/Javascript, Java가 뒤섞여 있는 방식이다.

가독성이 떨어지고 유지보수도 매우 어렵다.

프론트엔드/백엔드를 구분하지 않았던 예전엔 양쪽을 모두 개발하는 개발자들이 많았기 때문에 이런 방법을 이용했다.

 

▶️ 서블릿(Servlet)을 이용한 애플리케이션

JSP 방식과 Spring에서도 내부적으로 Servlet 방식을 사용한다.

서블릿은 클라이언트 웹 요청 처리에 특화된 Java 클래스의 일종이다.

서블릿 방식을 이용한다는 의미는 서블릿을 위한 자바 코드가 클라이언트 측 코드에서

분리되어 별도의 자바 클래스로 관리된다는 것을 의미한다.

하는 일에 비해 코드가 너무 길어보인다는 단점이 있다.

 

▶️ Spring MVC를 이용한 애플리케이션

서블릿 방식의 코드를 Spring MVC 방식의 코드로 바꾸면 코드가 간결해진다.

서블릿 방식은 클라이언트의 요청에 담긴 데이터를 꺼내오는 작업을 개발자가 직접 코드로 작성해야하고, 캐릭터셋도 지정해주어야 한다.

하지만 Spring MVC 방식의 코드에서는 눈에 보이지 않지만 그런 작업들을 Spring에서 알아서 처리해준다.

그런데도 Spring 기반의 애플리케이션의 기본 도구를 잡는 설정 작업이 여전히 불편하다는 단점이 있다.

그래서 이러한 문제를 대부분 개선한 Spring Boot가 나왔다.

 

▶️ Spring Boot을 이용한 애플리케이션

이전 기술에서 구현한 것을 더 짧은 코드로 간결하게 작성할 수 있다.

Spring MVC에서 겪었던 설정의 복잡함을 Spring Boot에서는 찾아볼 수 없다.

Spring의 복잡한 설정 작업도 Spring이 대신 처리해주기 때문에 개발자는

애플리케이션의 핵심 비즈니스 로직에만 집중할 수 있게 되었다.

 

 

※ 심화 학습

 

자바 서블릿이란?

자바 서블릿 자체를 사용하는 기술은 현재 거의 사용하고 있지 않지만 Spring MVC같은 자바 기반의 웹 애플리케이션 내부에서 여전히 사용되고 있다.

 

서블릿 컨테이너란?

서블릿 기반의 웹 애플리케이션을 실행해주는 것부터 시작해서 서블릿의 생명주기를 관리하며, 쓰레드 풀을 생성해서 서블릿과 쓰레드를 매핑시켜 주기도 한다.

아파치 톰캣(Apache Tomcat)은 서블릿 컨테이너의 한 종류로써 Spring MVC 기반의 웹 애플리케이션 역시 기본적으로 아파치 톰캣에서 실행 된다.

 

 

 

 

읽어주셔서 감사합니다. 좋은하루 되세요 🦾

오개념 지적은 환영입니다~

 

 

 

 

❑ Schema

 

 

➤ 스키마란?

 

데이터베이스에서 데이터가 구성되는 방식과 서로 다른 entities간의 관계에 대한 설명

데이터베이스의 청사진과 같음

entities : 테이블 하나하나의 정보 단위

 

다른 테이블에서 참조할 때는 기본키로 참조할 수 있음

다른 테이블에서 테이블의 기본 키(primary key)를 참조할 때 해당 값을 외래 키(foreign key)라고 함

보통 기본 키는 ID값이다

 

 

 

➤ 데이터베이스 설계

 

구조화된 데이터는 하나의 테이블로 표현 가능

테이블 : relation

테이블을 사용하는 데이터베이스를 관계형 데이터베이스(Relational database) 라고 함

 

 

▶️ 관계형 데이터베이스 키워드

 

data : 각 항목에 저장되는 값

table(또는 relation) : 사전에 정의된 열의 데이터 타입대로 작성된 데이터가 행으로 축적됨

column(또는 field) : 테이블의 한 열

record(또는 tuple) : 테이블의 한 행에 저장된 데이터

key : 테이블의 각 레코드를 구분할 수 있는 값, 각 레코드마다 고유한 값을 가짐, 기본키와 외래키 등이 있음

 

 

❑ 테이블의 관계

 

각 테이블 사이엔 관계가 존재한다.

 

➤ 테이블 관계의 종류

 

1:1 (일대일의 관계)

1:N (일대다의 관계)

N:N (다대다의 관계)

다대다 관계는 테이블의 관계를 좌표처럼 만들어서 새로운 join table 을 만들면 쉽게 표현할 수 있다.

 

그 외에 테이블 스스로 관계를 가질 수도 있다. (self referencing 관계)

 

 

➤ 1:1 관계(One-to-one relationship)

 

하나의 레코드가 다른 테이블의 한 개와 연결된 경우

1:1 관계는 자주 사용하지 않음

-> 1:1 로 나타낼 수 있다면 테이블을 합쳐서 하나의 테이블로 보는 것이 낫다.

예시) 학생 테이블과 주소 테이블의 관계

 

 

➤ 1:N 관계

 

하나의 레코드가 서로 다른 여러 개의 레코드와 연결된 경우

일대다 관계를 관계형 데이터베이스에서 가장 많이 사용함

예시) 직원 테이블과 부서 테이블의 관계

 

 

➤ N:N 관계

 

여러 개의 레코드가 다른 테이블의 여러 개의 레코드와 관계가 있는 경우

다대다 관계를 관리하기 위해서 join테이블을 만들어 관리함(기본 키 반드시 있어야함)

양방향에서 다수의 레코드를 가질 수 있다는 점에서 1:N 관계와 다르다

예시) 고객 테이블과 병원 테이블의 관계

 

 

➤ 자기참조 관계(Self Referencing Relationship)

 

테이블 내에서도 관계가 필요할 때도 있음

예를 들어 추천인이 누구인지 파악하기 위해 사용

한 명의 유저는 한 명의 추천인을 가질 수 있음

하지만 여러 명이 한 명의 유저를 추천인으로 등록할 수 있다.

이 관계는 1:N 관계와 비슷하지만 1:N은 서로 다른 테이블의 관계를 나타낼 때 표현하는 방식이다.

그러므로 같은 테이블 내에서 참조하는 관계는 자기참조 관계라고 부른다

 

 

 

 

읽어주셔서 감사합니다. 좋은하루 되세요 😁

오개념에 대한 지적은 언제나 환영입니다.

 

 

 

 

 

< 학습 목표 >

  •  SQL이 어떻게 이루어져 있는지 이해한다
  •  SQL 기본 query문을 사용할 줄 안다
  •  Schema의 설계 방법과 나은 방향성을 고안한다
  •  서버와 클라이언트 사이에서 주고 받는 데이터를 database에 저장하여 영속성 있게 저장할 수 있다.

 

 

❑ SQL

 

➤ SQL이란?

 

Structured Query Language (구조화된 Query 언어)

 

▶️ Query란?

직역하면 질의문이란 뜻이다.

가장 친숙한 예시로 검색창에 적는 검색어가 있다.

저장되어 있는 정보를 필터하기 위한 질문이라고 볼 수 있다.

SQL은 데이터베이스용 프로그래밍 언어이다.

데이터베이스에 query를 보내 원하는 데이터만을 뽑아올 수 있다.

 

 

➤ database가 왜 필요할까?

 

▶️ In-memory 데이터베이스

인메모리는 런타임에만 존재하는 데이터이다.

데이터를 보조기억장치가 아닌 RAM에서 읽고 쓴다.

CPU와 바로 데이터를 주고받기 때문에 보조기억장치에 저장하는 것보다 훨씬 빠르다.

하지만 전원이 꺼지면 데이터는 사라진다.

굉장히 빠르지만 많은 양을 담지는 못한다.

실무에선 주로 고속 데이터베이스 조작을 필요로 하는 애플리케이션에 인메모리 데이터베이스를 사용한다.

 

 

▶️ File I/O

원하는 데이터만 가져올 수 없고 항상 모든 데이터를 가져온 뒤 서버에서 필터링 필요

파일이 커질수록 비효율적

 

 

▶️ database

필터링 외에도 File I/O로 구현이 힘든 관리를 위한 여러 기능들을 가지고 있는 데이터에 특화된 서버

 

 

 

➤ 관계형 데이터베이스의 장점

 

하나의 CSV파일이나 엑셀 시트를 한개의 테이블로 저장할 수 있음

한번에 여러 개의 테이블을 가질 수 있어 데이터를 불러오기 수월함

 

 

 

➤ SQL

 

데이터베이스 언어

관계형 데이터베이스에서 사용

SQL구문을 사용할 수 있는 데이터베이스: MySQL, Oracle, SQLite, PostgreSQL

SQL을 사용하기 위해서는 데이터 구조가 고정되어 있어야 함

데이터의 구조가 고정되어 있지 않은 데이터베이스를 NoSQL이라고 함

NoSQL은 관계형 데이터베이스와 달리 테이블을 사용하지 않고 다른 형태로 데이터를 저장함

NoSQL의 대표적인 예로 MongoDB (문서 지향 데이터베이스)

 

데이터베이스에 쿼리를 날리면 작성한 조건에 맞는 데이터들을 필터해서 보여줌

 

 

➤ 기본 쿼리문

 

  • SELECT : 데이터를 불러온다
  • FROM  : 데이터를 불러올 곳(테이블)을 지정한다
  • WHERE : SELECT와 함께 사용되며 특정하게 지정된 값을 불러오는 기능을 한다.(원하는 값만 가져올 때)
  • AND, OR, NOT : 주로 WHERE 처럼 조건이 들어가는 쿼리문에 같이 사용한다
  • DISTINCT : SELECT와 함께 사용되며 중복되지 않는 유일한 값만 불러오는 기능을 한다
  • ORDER BY : 데이터를 정렬할 때 사용한다(기본값은 오름차순, 내림차순으로 작성하려면 DESC 속성값 부여하면 된다)
  • INSERT INTO (Statement) : 테이블 안에 새로운 데이터를 삽입할 때 사용된다
  • UPDATE : 테이블 안의 데이터를 수정할 때 사용된다
  • DELETE : 테이블 안의 데이터를 삭제할 때 사용된다
  • IS (NOT) NULL
  • COUNT : 데이터의 수를 세는 함수이다
  • AVG : 데이터의 평균 값을 구하는 함수이다
  • MIN / MAX : 데이터의 최솟값, 최댓값을 구하는 함수이다
  • LIKE : WHERE과 함께 쓰이는 조건 연산자이다 if와 같은 역할을 한다
  • Wildcard : 문자열에서 하나 이상의 문자를 대체하는데 사용된다
  • ALIASES : 별칭(별명)을 붙인다
  • JOINS : INNER JOIN, LEFT JOIN, RIGHT JOIN 이 있다
  • GROUP BY : 그룹을 지정한다

 

 

데이터베이스 관련 용어

  • CREATE DATABASE (database name);
  • CREATE TABLE (table name);
  • DROP DATABASE (database name);
  • DROP TABLE (table name);
  • BACKUP DATABASE (database name) TO DISK = 'filepath';
  • ALTER TABLE : 테이블에 column을 추가, 삭제, 변경할 때 사용
  • Not Null : column 생성시 null을 허용하지 않도록 설정하는 제약 조건
  • UNIQUE : column의 모든 값이 다르도록 지정하는 제약 조건
  • PRIMARY KEY : 테이블의 각 레코드를 기본키로 지정하는 제약 조건
  • FOREIGN KEY : 외부 테이블의 레코드와 연결하는 제약 조건
  • DEFAULT : column의 기본값을 지정하는 제약 조건
  • AUTO_INCREMENT : 레코드가 생성될 때마다 자동으로 고유 번호가 생성되도록 함

 

 

 

❑ ACID

 

트랜젝션(Transaction)

데이터베이스의 상태를 변환시키는 논리적 기능을 수행하기 위해 행해지는 하나 이상의 쿼리를 모아 놓은 하나의 작업 단위

 

 

➤ ACID?

 

데이터베이스 트랜젝션이 발생할 때, 그 안정성을 보장할 수 있는 성질

Atomicity : 원자성, 하나의 트랜젝션 내에서는 모든 연산이 성공하거나 모두 실패해야 한다. (하나의 연산이라도 실패하면 롤백시킨다)

Consistency : 일관성, 하나의 트랜젝션 전후에 데이터베이스의 일관된 상태가 유지되어야 한다.

Isolation : 격리성, 각각의 트랜젝션은 독립적이기 때문에 서로의 연산을 확인받거나 영향을 줄 수 없다.

Durability : 지속성, 하나의 성공된 트랜젝션에 대한 로그가 기록되고 영구적으로 남는다.

데이터베이스를 구축할 때 언제나 ACID를 지켜야 하는 것은 아니다.

ACID를 지키면서 설계하는 건 금융 계열에서 일할 때 필요하다.

 

 

 

❑ SQL(구조화 쿼리 언어) vs NoSQL(비구조화 쿼리 언어)

 

데이터베이스는 크게 관계형 데이터베이스와 비관계형 데이터베이스로 구분된다.

관계형 데이터베이스는 SQL을 기반으로 하고 비관계형은 NoSQL로 데이터를 다룬다.

 

 

➤ 관계형 데이터베이스

 

  • 테이블의 구조와 데이터 타입 등을 사전에 정의
  • 테이블에 정의된 내용에 알맞은 형태의 데이터만 삽입할 수 있음
  • 행(row) 와 열(column)으로 구성된 테이블에 데이터를 저장
  • 각 열은 하나의 속성에 대한 정보를 저장
  • 각 행은 열의 데이터 형식에 맞는 데이터가 저장
  • 데이터를 정확히 입력했다면 사용할 때 매우 수월함
  • 원하는 정보를 SQL을 활용해 쿼리할 수 있음 -> 스키마*가 뚜렷하게 보인다
  • 데이터를 입력할 때 스키마에 맞게 입력해야함
  • 테이블 간의 관계를 직관적으로 파악할 수 있음
  • 대표적인 관계형 데이터베이스 : MySQL, Oracle, SQLite, PostgreeSQL, MariaDB

 

*스키마

데이터베이스 스키마(database schema)는 데이터 베이스에서 자료의 구조, 자료의 표현 방법, 자료 간의 관계를 형식 언어로 정의한 구조이다

 

 

➤ 비관계형 데이터베이스

 

  • 데이터가 고정되어 있지 않은 데이터베이스를 가리킴
  • NoSQL이 스키마가 반드시 없는 것은 아님
  • 데이터를 읽어올 때 스키마에 따라 데이터를 읽어옴 -> ’schema on read’ 라고함
  • 읽어올 때에만 데이터 스키마가 사용됨
  • 데이터를 쓸 때 정해진 방식이 없는 것은 아님
  • 데이터를 입력하는 방식에 따라 데이터를 읽어올 때 영향을 미침
  • 대표적인 NoSQL: 몽고DB, Casandra

 

 

➤ NoSQL의 구성

 

  • Key-Value 타입
  • 문서형(Document) 데이터베이스
  • Wide-Column 데이터베이스
  • Graph 데이터베이스

 

 

➤ SQL기반의 데이터베이스와 NoSQL데이터베이스의 차이점

 

▶️ 데이터 저장(Storage)

NoSQL: key-value, document, wide-column, graph 등의 방식으로 데이터를 저장함

SQL: 테이블에 저장함, 미리 작성된 스키마를 기반으로 정해진 형식에 맞게 데이터를 저장해야함

 

▶️ 스키마(Schema)

SQL: 고정된 형식의 스키마가 필요함, 데이터 속성별로 열에 대한 정보를 미리 정해두어야함, 스키마는 나중에 변경이 가능하지만 이 경우 데이터베이스 전체를 수정하거나 오프라인(down-time)으로 전환할 필요가 있음

NoSQL: 관계형보다 동적으로 스키마 관리할 수 있음, 행을 추가할 때 즉시 새로운 열을 추가할 수 있고 개별 속성에 대해서 모든 열에 대한 데이터 값을 입력하지 않아도 됨

 

▶️ 쿼리(Querying)

SQL: 테이블의 형식과 관계에 맞춰 데이터를 요청해야함, 구조화된 쿼리 언어를 사용함

NoSQL: 데이터 그룹 자체를 조회하는 것에 초점을 두고 있음, 구조화 되지 않은 쿼리 언어로도 데이터 요청이 가능, UnQL(Unstructured Query Language)라고도 말함

 

▶️ 확장성(Scalability)

SQL: 수직적으로 데이터를 확장(높은 메모리, CPU를 사용하는 확장)

구축된 하드웨어의 성능을 많이 이용 -> 비용 많이 소모

여러 서버에 걸쳐서 데이터베이스의 관계를 정의할 수 있지만, 매우 복잡하고 시간이 소모됨

NoSQL: 수평적으로 데이터 확장(보다 값싼 서버 증설, 클라우드 서비스 이용하는 확장)

서버를 추가적으로 구축 -> 많은 트래픽을 보다 편리하게 처리

 

 

 

➤ SQL과 NoSQL 중 어떤 것을 사용해야 하나요?

 

정답은 없다.

각각의 상황에 맞게 선택하여 쓰지만 관계형, 비관계형을 모두 사용하여 서비스에 맞게 설계할 수도 있다.

 

▶️ SQL 기반의 관계형 데이터베이스를 사용하는 케이스

1. 데이터베이스의 ACID성질을 준수해야 하는 경우

금융 서비스를 위한 소프트웨어 개발에서는 반드시 ACID를 준수해야 하므로 SQL을 사용

2. 소프트웨어에 사용되는 데이터가 구조적이고 일관적인 경우

소프트웨어의 규모가 많은 서버를 필요로 하지 않고 일관된 데이터를 사용하는 경우

 

▶️ NoSQL 기반의 관계형 데이터베이스를 사용하는 케이스

1. 데이터 구조가 거의 또는 전혀 없는 대용량의 데이터를 저장하는 경우

2. 클라우드 컴퓨팅 및 저장공간을 최대한으로 활용하는 경우

3. 빠르게 서비스를 구축하는 과정에서 데이터 구조를 자주 업데이트 하는 경우

 

 

 

 

 

읽어주셔서 감사합니다. 좋은하루 되세요

오개념에 대한 지적은 언제나 환영입니다.🔥

 

 

 

 

❑ REST API

 

➤REST API 란?

 

REST는 Representational State Transfer의 약자

로이 필딩의 박사학위 논문에서 웹(http)의 장점을 최대한 활용할 수 있는 아키텍처로 처음 소개됨

데이터나 리소스를 HTTP URI로 표현하고, HTTP 프로토콜을 통해 요청과 응답을 정의하는 방식

API는 쉽게 말해서 app끼리 소통하게 해주는 것이다.

 

➤ 좋은 REST API를 디자인하는 방법

 

REST API를 작성할 때는 몇 가지 지켜야 할 규칙들이 있음

REST 방법론을 보다 더 실용적으로 적용하기 위해 레오나르드 리차드슨(Richardson)이 REST API를 잘 적용하기 위한 4단계 모델(0~3단계)를 만들었다.

로이필딩은 이 모델의 모든 단계를 충족해야 REST API라고 부를 수 있다고 주장했지만

실제로 3단계까지 지키기 어렵기 때문에 2단계 까지만 지켜도 좋은 API 디자인이라고 볼 수 있음

2단계 까지 지킨 경우에 HTTP API라고도 부른다.

 

 

➤ Richardson의 REST 성숙도 모델 구조화

 

REST API 성숙도 모델

 

▶️ REST 성숙도 모델 - 0단계 : HTTP 사용

 

0단계에서는 단순히 HTTP protocol을 사용하기만 해도 된다.

이 단계만 작성한 경우 REST API라고 할 수는 없다.

0단계는 좋은 REST API를 작성하기 위한 기본 단계이다.

 

 

▶️ REST 성숙도 모델 - 1단계 : 개별 리소스와의 통신을 준수

 

REST API는 웹에서 사용되는 모든 데이터나 자원을 HTTP URI로 표현한다.

그래서 모든 자원은 개별 리소스에 맞는 엔드포인트(Endpoint)를 사용해야 하고

받은 자원에 대한 정보를 응답으로 전달해야 한다.

위의 0단계는 모든 요청에 endpoint를 모두 같게 할 수도 있지만

1단계에서는 요청하는 리소스가 무엇인지에 따라 각각 다른 엔드포인트로 구분해서 사용해야 한다.

 

※ 엔드포인트 작성 요령

  • 동사, HTTP 메서드, 어떤 행위에 대한 단어 사용은 지양
  • 리소스에 집중해 명사 형태의 단어 사용

 

요청에 따른 응답으로 리소스를 전달할 때에도 사용한 리소스에 대한 정보와 성공/실패 여부를 반환해야함

 

 

▶️ REST 성숙도 모델 - 2단계

 

CRUD에 맞게 적절한 HTTP 메서드 사용을 중점에 둠

GET : 서버의 데이터를 변환시키지 않는 요청에 사용

POST : 요청마다 새로운 리소스를 생성

PUT : 요청마다 리소스를 반환, 매 요청마다 같은 리소스를 반환하는 특징을 멱등성(idempotent)이라고 함

PUT : 교체 PATCH는 수정 용도로 사용

 

※ 더 자세한 내용

https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods

 

2단계 까지 적용하면 잘 작성된 API라고 여긴다.

REST 3단계까지 따라야 REST API라고 부를 수 있다고 로이 필딩은 주장하지만

3단계까지 적용하는 경우는 극히 드물다.

따라서 반드시 3단계까지 적용해야 하는 것은 아니다.

 

 

▶️ REST 성숙도 모델 - 3단계

 

HATEOAS(Hypertext As The Engine Of Application State)

하이퍼미디어 컨트롤 적용

요청은 2단계와 동일

응답에서 리소스의 URI를 포함한 링크 요소를 삽입하여 작성한다는 점이 다르다.

응답에 새로운 링크를 넣어 기능에 접근할 수 있도록 함

 

 

※ 그 외 API 작성 디자인(추후 공부)

 

  • 5 Basic REST API Design Guidelines
  • 호주 정부 API 작성 가이드
  • 구글 API 작성 가이드
  • MS의 REST API 가이드 라인

 

 

❑ Open API와 API Key

 

➤ Open API

 

누구에나 열려있는 API

누구에게나 열려있다고 해서 무제한으로 이용할 수 있는 것은 아니다.

어떤 API는 이용 수칙에 따라 제한사항(가격, 정보의 제한)이 있을 수 있다.

정부에서 제공하는 공공데이터 포털에 접속하면 원하는 키워드의 API를 확인할 수 있다.

대표적인 Open API에는 날씨 API가 있다.

 

 

➤ API Key

 

API를 이용하기 위해서는 API Key가 필요하다.

API Key는 서버의 문을 여는 열쇠라고 볼 수 있다.

로그인된 이용자에게만 자원에 접근할 수 있는 권한을 API Key 형태로 제공한다.

데이터를 요청할 때마다 API Key를 같이 전달해야 원하는 응답을 얻을 수 있다.

 

 

 

❑ Postman으로 API 실습하기

 

Postman : https://www.postman.com/

 

Postman API Platform | Sign Up for Free

Postman is an API platform for building and using APIs. Postman simplifies each step of the API lifecycle and streamlines collaboration so you can create better APIs—faster.

www.postman.com

 

HTTP API 테스트 도구 (CLI)

  • curl (대부분의 리눅스 환경에 내장)
  • wuzz

HTTP API 테스트 도구 (GUI)

  • Postman
  • Insomnia

 

https://openweathermap.org/

 

Сurrent weather and forecast - OpenWeatherMap

Access current weather data for any location on Earth including over 200,000 cities! The data is frequently updated based on the global and local weather models, satellites, radars and a vast network of weather stations. how to obtain APIs (subscriptions w

openweathermap.org

 

크롬 브라우저 검색창에 입력해서 결과 같은지 확인한다.

JSON 형태의 결과값을 정리해서 보여주는 확장프로그램을 사용했다. (JSON Viewer)

크롬 브라우저 결과

{
    "coord": {
        "lon": 127.4167,
        "lat": 36.3333
    },
    "weather": [
        {
            "id": 802,
            "main": "Clouds",
            "description": "scattered clouds",
            "icon": "03d"
        }
    ],
    "base": "stations",
    "main": {
        "temp": 296.12,
        "feels_like": 295.7,
        "temp_min": 296.12,
        "temp_max": 296.12,
        "pressure": 1010,
        "humidity": 47,
        "sea_level": 1010,
        "grnd_level": 1004
    },
    "visibility": 10000,
    "wind": {
        "speed": 1.15,
        "deg": 274,
        "gust": 0.98
    },
    "clouds": {
        "all": 45
    },
    "dt": 1654665772,
    "sys": {
        "type": 1,
        "id": 8131,
        "country": "KR",
        "sunrise": 1654632758,
        "sunset": 1654685173
    },
    "timezone": 32400,
    "id": 1835224,
    "name": "Daejeon",
    "cod": 200
}

 

Postman weatherAPI 결과

 

 

 

 

 

읽어주셔서 감사합니다. 좋은하루 보내세요😍

오개념에 대한 지적은 언제나 환영입니다.

 

 

 

❑ Client-Server Architecture

 

 

➤ 클라이언트-서버 아키텍쳐(2-Tier Architecture)

 

서버는 말 그대로 제공(serve)하는 주체

리소스를 사용하는 곳이 ‘클라이언트

리소스를 제공하는 곳이 ‘서버

 

client가 데이터 전송하면서 요청  server가 응답

client의 요청 없이 server가 응답오는 경우는 없음

 

 

 

➤ 3-Tier Architecture

 

Client - Server - Database

2-Tier 아키텍처에 데이터베이스 추가된 형태

데이터베이스: 리소스를 저장하는 공간 (창고와 같은 역할)

 

프론트엔드는 사용자의 눈에 보이는 UI를 디자인하여 상호작용 할 수 있는 앱을 개발하는 일을 한다.

백엔드는 눈에 보이지 않는 로그인, 로그아웃, 상품정보를 API 노출하는 등의 사용자 인증을 주로 다루는 개발자이다.

백엔드 개발자가 데이터베이스 등의 시스템 설계까지 도맡아서 하는 경우도 많다.

 

 

 

➤ 클라이언트와 서버의 종류

 

▶️ 클라이언트

 

주로 플랫폼에 의해 구분됨

크롬같은 웹 브라우저가 대표적인 클라이언트임

 

 

▶️ 서버

 

서버는 하는 일에 따라 종류가 다름

파일 서버(파일을 제공)

웹 서버(웹 사이트에서 필요로 하는 정보 제공)

메일 서버(메일을 주고받을 수 있게 해줌)

데이터베이스(데이터 제공)

 

 

 

❑ HTTP

 

➤ Protocol(프로토콜)

 

서버와 클라이언트가 정보를 주고받는 프로토콜이 존재해야 한다.

정해진 프로토콜 -> http

HTTP를 이용해 주고받는 메시지를 HTTP 메시지 라고함

HTTP만의 규칙이 있고 그 규칙을 지켜야지만 한다

 

 

➤ 참고) OSI 7계층

 

OSI 7계층은 네트워크 데이터 통신을 설명할 때 반드시 있어야 하는 중요한 개념입니다.

과거에는 통신용 규약이 표준화 되지 않아서 호환되지 않는 시스템이나 애플리케이션이 많았고 통신이 불가능 했습니다.

이를 하나의 규약으로 통합하려는 노력이 현재의 OSI 7계층에 남아있습니다.

OSI 7계층이 네트워크 동작을 나누어 이해하고 개발하는데 많은 도움이 되므로 네트워크의 주요 레퍼런스 모델로 활용되고 있습니다.

하지만 현재는 대부분의 프로토콜이 TCP/IP 프로토콜 스택 기반으로 되어 있습니다.

-IT엔지니어를 위한 네트워크 입문-

 

➤ OSI 모델과 TCP/IP 모델

OSI 7계층과 TCP/IP 모델 비교

 

 

❑ API(Application Programming Interface)

 

서버에 클라이언트가 어떤식으로 요청을 보내야 하는지 모르기 때문에

카페의 메뉴판 처럼 리소스를 잘 활용할 수 있도록 제공하는 것이다.

Interface : 의사소통이 가능하도록 만들어진 접점

카페에서 메뉴판에 아이스 아메리카노, 카페라떼 등 가능한 요청을 명시해서 고객에게 보여줘야

고객이 엉뚱한 주문(예를 들어 국밥)을 하지 않고 올바른 주문을 넣을 수 있다.

이처럼 서버가 리소스를 받을 메뉴판인 API를 구축해놓아야 클라이언트가 이를 활용해서 요청을 할 수 있는 것이다.

보통 인터넷에서는 HTTP라는 프로토콜을 사용하고 주소(URL, URI)를 통해 접근 가능 하다.

 

 

➤ HTTP 작성하기

 

CRUD

Create Read Update Delete : 컴퓨터 소프트웨어에서 기본적으로 데이터를 처리하는 기능

 

▶️ HTTP 대표적 메소드

  • GET : 조회 (Read)
  • POST : 추가 (Create)
  • PUT(PATCH) : 갱신 (Upload)
  • DELETE : 삭제 (Delete)

 

 

 

❑ URL과 URI

 

 

➤ URL

 

브라우저의 주소창에 입력한 URL은 서버가 제공하는 환경에 존재하는 파일의 위치를 나타냄

Uniform Resource Locator의 줄임말

네트워크 상의 웹페이지, 동영상, 이미지 등의 파일이 위치한 정보를 나타냄

 

scheme, hosts, url-path로 구분

scheme: 통신방식(프로토콜) ex) http://  file://

hosts : 웹 서버의 이름이나 도메인, IP 주소

url-path : 해당 웹 서버의 루트로부터 웹페이지, 이미지, 동영상 등이 위치한 경로와 파일명

 

127.0.0.1 은 로컬 PC를 나타냄

 

 

➤ URI

 

Uniform Resource Identifier의 줄임말

URL의 기본 요소(scheme, hosts, url-path) + query(쿼리), bookmark

query : 웹 서버에 보내는 추가적인 질문

브라우저의 검색창을 클릭하면 나타나는 주소가 URI이다.

URI는 URL을 포함하는 상위 개념이다.

 

 

 

❑ IP와 포트

 

➤ IP

 

네트워크에 연결되어 있는 특정 PC의 주소를 나타내는 체계를 IP address(Internet Protocol address)라고 함

172.31.0.1 -> 총 4부분의 숫자가 3개의 . 으로 나누어진 형태

한부분을 옥텟(Octet)이라고 부름

옥텟은 모두 .으로 구분 되어 있음

인터넷에 연결된 모든 PC는 IP주소 체계에 따라 4부분의 숫자로 구분됨

이런 주소체계를 IPv4라고 함 (version4)

IP주소의 각 부분은 0~255까지 표현 가능-> 1옥텟에 1byte 차지

이 체계를 따르면 32bit(8x4)를 이용해서 2^(32)인 약 43억 개의 IP 주소 표현 가능

 

localhost, 127.0.0.1 : 현재 사용 중인 로컬 PC를 지칭

0.0.0.0, 255.255.255.255 : broadcast address, 로컬 네트워크에 접속된 모든 장치와 소통하는 주소, 서버에서 접근 가능 IP주소를 broadcast address로 지정하면 모든 기기에서 서버에 접근 가능함

 

 

▶️ IPv4 vs IPv6 비교

 

인터넷 보급률이 낮았던 때에는 IPv4로 네트워크에 연결된 모든 PC에 주소를 할당하는 것이 가능했다.

그러나 개인 PC가 보급되면서 전 세계의 수많은 PC가 인터넷에 연결되면서 각각의 IP가 필요해졌고

IPv4로 할당할 수 있는 PC 수를 넘어버렸다.

이런 문제를 해결하기 위해 IPv6가 생겼다.

IPv62^(128)개의 주소 표현이 가능하다.

 

 

➤ PORT

 

포트는 IP주소가 가리키는 PC에 접속할 수 있는 통로(채널)을 의미함

이미 사용중인 포트는 중복해서 사용할 수 없다.

IP가 집 주소라면  PORT는 호수라고 보면 된다.

포트 번호는 0~65,535까지 사용 가능하다.

0~1024번 까지는 통신을 위한 규악에 따라 정해져 있는 포트다.

▶️ 반드시 알아야 하는 포트 번호

  • 22 : SSH
  • 80 : HTTP
  • 443 : HTTPS

 

정해진 포트라도 필요에 따라 자유롭게 사용 가능하다.

URI에도 PORT를 명시한다.

잘 알려진 포트는 명시하지 않지만 잘 알려지지 않은 포트는 반드시 포함해야 한다.

 

 

 

❑ 도메인과 DNS

 

➤ Domain name

 

웹 사이트에 진입할 때 IP주소를 대신하여 사용하는 주소

IP = 도로명 주소, 지번 주소

Domain name = 상호, 아파트 이름

IP는 특성상 한눈에 파악하기 힘들고 길지만 도메인 이름은 바로 파악 가능하다.

 

 

➤ DNS

 

모든 PC는 IP주소를 가지고 있지만 모든 로컬 PC가 도메인 이름을 가지는 것은 아니다.

127.0.0.1은 localhost로 사용할 수 있지만 그 외의 모든 도메인 이름은 일정 기간 동안 대여해야 사용 가능하다.

그렇다면 도메인 이름과 해당 IP를 어떻게 연결할까?

네트워크에는 도메인 이름으로 IP를 찾아주는 서버가 따로 존재한다.

DNS(Domain Name System)은 호스트의 도메인 이름을 IP주소로 변환하거나

반대의 경우를 수행할 수 있도록 개발된 데이터베이스 시스템이다.

만약 주소창에 daum.net 입력하면 요청이 DNS에서 IP주소(211.249.220.24) 찾는다.

 

 

 

읽어주셔서 감사합니다.

오개념에 대한 지적은 언제나 환영입니다 🙂

 

 

 

 

 

코드스테이츠 학습목표

  • 알고리즘이 무엇인지 설명할 수 있다.
  • 알고리즘 문제를 이해하고 전략을 세울 수 있다.
  • 알고리즘 풀이에 필요한 의사 코드를 작성할 수 있다.
  • 의사 코드에서 세운 전략을 코드로 구현할 수 있다.
  • 내가 구현한 알고리즘을 자바 언어로 설명할 수 있다.

 

 

 

❑ Algorithm

 

 

➤ 알고리즘이 무엇인가?

 

알고리즘은 어떠한 문제를 해결하기 위해 정해진 일련의 절차이다. - 위키백과 -

 

알고리즘은 문제를 해결하기 위한 최선의 선택이다.

 

 

➤ 코딩테스트 푸는 전략

 

시작하기

  • 대부분의 코딩테스트는 문제의 설명, 입출력 예시, 제한사항, 주의사항 등으로 문제 상황을 제시
  • 조건을 토대로 문제를 이해하는 것부터 시작

 

문제 해결 전략 세우기

  • 수도 코드를 작성하기 전 전체적인 그림을 종이에 그려가는 작업이 필요함
  • 누군가와 같이 해결해야 한다면 그림을 그려가면서 설명하고 논의해서 해결해야 함
  • 코드 작성전에 수도 코드 먼저 작성하기! 수도 코드만 잘 짜도 코딩이 쉽다!

 

 

 

 

❑ 의사코드(pseudoicode)

 

 

➤ 의사코드(pseudocode) 란?

 

프로그래밍 언어로 코드를 작성하기 전에 우리가 쓰는 일상 언어로 프로그램이 작동하는 논리를 먼저 작성하는 것

 

 

➤ 의사코드의 장점

 

1. 시간이 단축된다

코드가 간단하면 수도코드를 작성하는게 더 시간이 걸린다.

하지만 길고 복잡한 코드를 작성할 때는 세세한 부분까지 작성하면서 로직이 기억나지 않을 수 있고 결국 시간이 더 걸리게 된다. 그래서 수도 코드를 먼저 작성하면 수도 코드가 지표가 되어 헤매는 시간이 줄어든다!

 

2. 디버깅이 용이하다

프로그래밍 언어로만 된 코드를 디버깅 할 때 오류가 난 부분이 어느 부분인지 알아보기 힘들다. 하지만 모국어로 된 수도 코드를 보면 해당 부분이 논리적으로 어느 절차인지 쉽게 이해할 수 있다.

 

3. 프로그래밍 언어를 모르는 사람과 소통할 수 있다

수도 코드는 우리의 일상 언어로 쓰여졌기 때문에 프로그래밍 언어를 모르는 사람도 프로그램의 수도코드를 보면 어떤 로직으로 동작하는지 이해할 수 있다.

 

 

➤ 왜 구체적으로 써야 할까?

 

컴퓨터는 사람과 달리 알려주지(배우지) 않은 부분은 스스로 할 수가 없기 때문에 세세한 절차까지 코드로 알려주어야 한다.

그래서 의사 코드를 빈틈없이 작성하면 실제 코드에서 빠트리는 부분이 없게 되어 코드가 문제없이 작동할 수 있다.

 

 

➤ 의사코드 작성법? 올바른 작성?

 

의사코드는 자연어(영어나 한국어처럼 일상에서 쓰는 언어)만 사용해도 되고 프로그램 언어와 섞어서 써도 된다.

협업을 하는 실제 업무에서는 의사코드는 매우 중요하다.

따라서 의사 코드에 대한 내용은 클린코드 ‘4장 주석’ 을 읽으면서 더 깊게 알아갈 필요가 있다.

 

 


 

 

❑ 시간 복잡도(Time Complexity)

 

알고리즘에서 시간 복잡도는 Big-O 표기법을 사용해서 비교한다.

 

알고리즘 문제를 풀다보면 해결하는 것 만큼 얼마나 효율적으로 풀었는지도 중요하다.

어떤 알고리즘 문제들은 프로그램 연산에 제한 시간이 있는 경우도 있다.

 

효율적인 방법을 고민한다

= 시간 복잡도를 고민한다

 

 

➤ 시간 복잡도?

 

입력값의 변화에 따라 연산을 실행할 때, 연산 횟수에 비해 시간이 얼마만큼 걸리는가?

 

알고리즘은 연산이 많아질수록 시간이 오래걸린다.

시간 복잡도는 연산 횟수와 관계있다.

 

 

➤ Big-O

 

  • Big-O(빅-오) : 최악의 경우
  • Big-Ω(빅-오메가) : 최선의 경우
  • Big-θ(빅-세타) : 중간(평균)의 경우

 

주로 빅오(최악의 경우)를 가장 많이 사용한다.

프로그램이 실행되는 과정에서 소요되는 최악의 시간까지 고려할 수 있기 때문이다.

“최소한 이 정도 걸린다” 보다는 “이 정도 시간까지 걸릴 수 있다” 를 고려해야 모든 상황에 대응이 가능하기 때문이다.

 

 

➤ Big-O의 수학적 정의와 계산법

 

어떤 함수 f(n)의 Big-O notatino이 O(g(n))이라는 것은

n의 값이 일정 수준을 넘어가면 그 이상의 어떤 n을 대입하여도 c*g(n)보다 결과값이 작은 상수 c가 존재한다는 뜻이다.

 

시간 복잡도는 단위연산(정의, 단순계산, 비교, 출력 등)의 횟수를 기준 함수로 둔다.

 

int result = 0;
for(int i = 1; i <= n; i++) {
	for(int j = 1; j <= i; j++) {
    	result++;
    }
}

 

위 알고리즘의 연산횟수는 1+2+ ... + n 이므로 n(n+1)/2 이다.

단위연산의 수를 T(n)이라 할 때, T(n) = n(n+1)/2 + 2 이다.

빅오 표현법으로 나타내기 위해 적절한 g(n)과 c, n0를 선택한다.

g(n) = n^2, c = 1, n0 = 3 이라고 하면

c * g(n) = n^2 >= T(n)

n*n >= n(n+1)/2 + 2

양 변에 *2 ➡️ 2n*n >= n(n+1) + 2*2

n*n + n*n >= n^2 + n + 4

n^2 >= n + 4

➡️ n0인 3 이상의 모든 수 n에 대하여 T(n)보다 c*g(n)의 값이 크다

따라서 이 알고리즘의 시간복잡도는 O(n^2)이라고 표기한다.

 

 

※ Big-O의 표기법

 

가능한 가장 작은 표기법을 사용한다.

O(n^2)도 되고 O(n)도 된다면 더 작은 O(n)을 사용한다.

가능한 가장 간단하게 표기한다.

O(3n+4)과 같이 쓰지 않고 O(n)으로 쓴다.

 

 

 

➤ 많이 쓰는 Big-O

 

 

O(1) : constant complexity

입력값이 증가해도 시간(연산)이 늘어나지 않는다.

 

O(n) : linear complexity

입력값이 증가하면 시간도 같은 비율로 증가

 

O(log n) : logarithmic complexity

O(1) 다음으로 빠른 시간 복잡도를 가짐

BST(이진 탐색 트리)가 O(log n)의 시간복잡도를 가짐

연산을 할 수록 전체 해야할 연산 수가 줄어들 때이다

 

for(int i = 0; i < n; i++) {
	i *= k;
}

 

예를 들어 i는 연산할 수록 k가 곱해지고 n과 비교한다. 따라서 k*k*k*...(t번 실행 -> k^t) >= n 가 될 때까지 t번 실행하게 된다.

(여기서 증감문의 i++는 신경쓰지 않아도 된다. n이 무수히 커질 수록 +1이나 상수를 곱하는건 근소한 차이이기 때문에 무시해도 되기 때문이다.)

여기서 k^t = n 를 만족하는 t만큼 실행하게 되는 것이다.

t = logk n인 것이다.

따라서 시간 복잡도는 O(logk n) ➡️ O(log n) 이다.

(O(log2 n)이나 O(log3 n)등도 모두 O(log n)으로 표기한다.)

 

 

 

O(n^2) : quadratic complexity

O(n^2)이나 O(n^5) 등도 모두 O(n^2)으로 표기한다.

시간 복잡도가 O(n^2)이 되는 순간 부터 입력값이 커질수록 컴퓨터에 가는 부담이 어마어마 해진다...

여러번 중첩된 for문은(실행수가 입력값에 영향을 받을 때) 가능하다면 피하는 것이 좋다..

 

O(2^n) : exponential complexity

가장 느린 시간 복잡도를 가짐

재귀를 이용한 알고리즘이 보통 O(2^n)의 시간복잡도를 갖는다.

그래서 재귀를 이용하면 코드는 직관적이고 짧아지지만 입력값이 커질수록 실행시간이 엄청 늘어난다.

재귀로 작성한 피보나치 수열을 떠올려보자.

100번 실행하려면....2의 100승을 계산해야 한다...

피보나치는 입력값이 커질 것을 대비하고 싶다면 재귀보다는 배열을 사용해서 이전인덱스와 전전인덱스를 불러오는 것이 효율적이다..

 

 

➤ Big-O는 어떻게 활용할까?

대부분 코딩테스트에서 실행 타임에 제한 시간이 걸려있다.

최대 입력값을 확인하고 시간복잡도를 고려해서 알고리즘을 설계할 수 있는지 확인하는 것이다.

 

입력값이 최대일 때를 항상 고려해서 알고리즘을 설계하면 안정적인 프로그램을 만들 수 있다.

입력값의 최댓값이 많이 크다면 시간 복잡도가 작은 알고리즘으로 작성하는 것이 좋다.

그런데 입력값이 작다면 굳이 시간을 들이고 머리를 굴려가면서 시간 복잡도가 작은 알고리즘을 찾을 필요는 없다.

보통 데이터 크기에 따른 시간복잡도 설계는 이 정도만 해도 된다.

 

n <= 1,000,000 ➡️ O(n) or O(log n)

n <= 10,000 ➡️ O(n^2)

n <= 500 ➡️ O(n^3)

 

 

Big-O 정리

 

 


 

❑ 탐욕 알고리즘(Greedy)

 

말 그대로 선택의 순간마다 당장 눈앞에 보이는 최적의 상황을 쫓아 최종적인 해답에 도달하는 방법

매 순간 최적이라 생각되는 해답(locally optimal solution)을 찾고 최종 문제의 해답(globally optimal solution)에 도달하는 문제 해결 방식

항상 최적의 결과를 도출하는 것은 아니지만 어느 정도 최적의 근사한 값을 빠르게 도출할 수 있다는 장점이 있음

 

 

➤ 탐욕 알고리즘  해결 방법

 

1. 선택 절차(Selection Procedure)

현재 상태에서의 최적의 해답을 선택

2. 적절성 검사(Feasibility Check)

선택된 해가 문제의 조건을 만족하는지 검사

3. 해답 검사(Solution Check)

원래의 문제가 해결되었는지 검사하고 해결되지 않았다면 선택 절차로 돌아가 위 과정 반복

 

 

➤ 탐욕 알고리즘은 은탄?

 

현재의 최적의 선택이 언제나 최적의 결과를 보장하진 않는다.

탐욕 알고리즘을 사용한 것이 꼭 최적의 결과는 아닌 경우도 있다.

 

ex) 마시멜로 실험 결과

마시멜로를 지금 받으면 1개 1분을 기다렸다가 받으면 2개를 받을 수 있다.

greedy는 현재의 최적의 선택인 지금 1개를 받는 것을 선택하지만

최종적으로는 1분을 기다리고 2개를 받는 것이 최적의 결과이다.

 

 

➤ 탐욕 알고리즘을 적용하기 위한 조건

 

1. 탐욕적 선택 속성(Greedy Choice Property) : 앞의 선택이 이후의 선택에 영향을 주지 않는다

2. 최적 부분 구조(Optimal Substructure) : 문제에 대한 최종 해결 방법은 부분 문제에 대한 최적 문제 해결 방법으로 구성된다

 

 

 

읽어주셔서 감사합니다. 좋은 하루 되시고 도움이 되셨길 바랍니다.

오개념에 대한 지적은 언제나 환영입니다~😍

 

 

 

 

 

 

 

❑ Binary Search Tree(이진 검색 트리)

 

 

모든 노드의 자식 노드가 단 두 개 뿐인 트리

오른쪽, 왼쪽 자식 두 개만 존재

왼쪽, 오른쪽 자식을 구분

한 쪽만 있거나 둘다 없는 노드가 있어도 됨

모든 왼쪽 자식의 값이 루트나 부모보다 작고, 오른쪽 자식의 값이 루트나 부모보다 큰 값을 가진다

 

 

➤ 이진 트리 종류

 

이진 트리의 종류

 

완전 이진 트리(Complete binary tree)

  • 마지막 레벨을 제외한 레벨은 노드를 빠짐없이 가득 채워야 한다
  • 마지막 레벨은 왼쪽부터 오른쪽 방향으로 노드를 빠짐없이 채우되 반드시 끝까지 채울 필요는 없다
  • 마지막 레벨의 왼쪽은 채워져 있어야 한다

 

정 이진 트리(Full binary tree)

  • 각 노드가 0개 혹은 2개의 자식 노드를 가짐

 

포화 이진 트리(Perfect binary tree)

  • 완전 이진 트리이면서 정 이진 트리인 이진 트리
  • 모든 리프의 레벨이 같다
  • 모든 레벨이 가득 차 있다

포화 이진 트리

 

 

 

 

❑ BFS/DFS

 

 

➤ 너비 우선 탐색(BFS, breadth-first search)

 

너비 우선 탐색

 

1. 낮은 레벨부터 왼쪽에서 오른쪽 방향으로 탐색하고

2. 한 레벨의 탐색이 끝나면 다음 레벨로 내려감

이 과정을 반복

 

 

➤ 깊이 우선 탐색(DFS, depth-first search)

 

깊이 우선 탐색

 

리프에 도달할 때까지 아래로 내려가면서 탐색

더 이상 탐색할 곳이 없으면 부모에게 돌아감

그런 다음 다시 자식 노드로 내려감

자식 노드가 2개 있을 때 부모 노드를 총 3번 거쳐가는데 언제 부모 노드의 값을 탐색할지는 3가지 방법이 있다.

예를 들어 D, H, I에서

전위 순회(preorder)는 부모 노드를 먼저 탐색한다.

D -> H -> I

중위 순회(inorder)는 부모 노드를 중간에 탐색한다.

H -> D -> I

후위 순회(postorder)는 부모 노드를 마지막에 탐색한다.

H -> I -> D

 

 

 

 

 

선배적 참견시점(선참시)

 

면접에서 반드시 물어보는 질문

어떤 어려움을 겪었고 어떻게 해결했는가!

자기가 블로그에 쓴 글에 대한 질문에 답변을 못하면 안된다

동기들과 함께 한다는 마음으로 응원도 많이 하고 소통 활발히 하자

선참시

좋은 리프레쉬 시간이었다.

 

 

 

그외) 배열 깊은 복사 쉽게하기

 

Arrays.clone() 메소드 이용

arr2 = arr.clone();

 

 

 

 

정리해놓고 포스팅을 늦게 올렸다.. ㅇ.ㅇ

점점 게을러 지고 있는데 정신 차릴 필요가 있다. 😡

 

 

읽어주셔서 감사합니다.

오개념에 대한 지적은 언제나 환영입니다.😍

 

 

 

1 2 3 4 5 6 7