목록CS (50)
GiYeong

1. 경량 FrameWork 옛날 FrameWork는 하나의 기능을 위해서 많은 구조가 필요했다. 기술이 너무 복잡하고 방대하기 때문에, 전체를 이해하고 개발하기에 어려움이 있었다. Spring FrameWork는 특정 기능을 위주로 간단한 jar 파일 등을 이용해서 모든 개발이 가능하도록 구성되어있다. 2. POJO 기반의 구성 POJO(Plain Old Java Object, 오래된 방식의 간단한 자바 객체)를 사용할 수 있다. 즉, Java에서 객체를 구성하는 방식을 Spring Framework에서 그대로 사용할 수 있기 때문에, 자유롭게 객체지향적 설계를 구현할 수 있다. 3. DI를 통한 객체 간의 관계 구성 Spring에서는 ApplicationContext가 필요한 객체들을 생성하고, 주입..

스크립트 언어와 컴파일 언어 스크립트 언어(Scripting Language) 소스 코드를 컴파일하지 않고 인터프리터로 소스 코드를 한줄한줄 읽어 바로 실행하는 방식으로 동작하는 언어 인터프리터(Interpreter) 소스 코드를 바로 실행하는 컴퓨터 프로그램 또는 환경 컴파일을 하지 않고 소스 코드를 읽으면서 바로 실행하기 때문에 속도가 느리다. ex) Python 컴파일 언어(Compiled Language) 소스 코드를 컴파일한 수, 기계어를 CPU/Memory를 통해 읽어 실행하는 방식으로 동작하는 언어 규모가 큰 프로그램이라면 컴파일에 시간이 오래 걸릴 수 있지만, 컴파일 후 실행속도는 빠르다. ex) C++, Java Imterpreter Compiler 번역 단위 전체 행(줄) 번역 속도 빠..

강한 결합과 느슨한 결합 강한 결합 객체의 의존 관계에서 강한 결합이란, 어떤 객체가 다른 객체에 강한 의존성을 가지고 있음을 말한다. 객체 간에 강한 결합을 이루고 있으면, 한 클래스가 변경될 경우 연관된 다른 클래스도 변경되어야 하며, 이는 유지보수 측면에서 굉장히 불리한 케이스이다. 느슨한 결합 클래스의 자료구조, 메서드를 추상화 할 수 있는 인터페이스를 사용해서 의존성을 최소화하여 강한 결합을 약화시키고 느슨한 결합을 이루게 할 수 있다. 직렬화와 역직렬화 직렬화 객체를 직렬화하여 전송 가능한 형대로 만드는 것을 의미한다. 즉, 객체들의 데이터를 연속적인 데이터로 변형하여 Stream을 통해 데이터를 읽도록 해준다. 직렬화를 하기 위해서는 Serializable 인터페이스를 구현하여야 한다. pu..

SOLID (객체지향 개발 5대 원리) 1. SRP (단일 책임의 원칙 : Single Responsibility Principle) 하나의 모듈(클래스)은 하나의 기능만 가지며, 모듈이 제공하는 모든 서비스는 그 하나의 책임을 수행하는 데 집중되어 있어야 한다. 2. OCP (개방 폐쇄 원칙 : Open-Cloces Principle) 확장에 대해 열려있고, 수정에 대해서는 닫혀있어야 한다. 즉, 요구사항이 변경될 때 새로운 동작을 추가하여 애플리케이션의 기능을 확장할 수 있어야 하고, 기존의 코드를 수정하지 않고 애플리케이션의 동작을 추가하거나 변경할 수 있어야 한다. 3. ISP (인터페이스 분리 원칙 : Interface Segregation Principle) 클래스는 자신이 사용하지 않는 인터..

인터페이스와 추상 클래스의 차이점 추상클래스 클래스 안에 추상 메서드가 하나 이상 포함되거나 abstract로 정의된 경우 인터페이스 모든 메서드가 추상 메서드인 경우 추상 클래스 인터페이스 공통점 객체를 생성할 수 없다. 선언부만 있는 멤버는 하위 클래스에서 반드시 구현해야 한다. 차이점 일반 클래스에 추상 메서드가 추가된 형태 모든 메서드가 추상 메서드 일반 변수와 일반 메서드 포함 가능 추상 메서드와 상수만 포함 가능 추상 클래스를 상속받아 기능을 이용하고, 확장시키는 목적 함수의 구현을 강제하여 구현 객체의 같은 동작을 보장하는 목적 단일 상속 (Java는 모호성으로 인해 다중 상속을 지원하니 않음) 여러 개의 인터페이스를 구현 가능 (다중 상속처럼 동작) 클래스와 객체(인스턴스)의 차이 클래스 ..

제네릭(Generic) Java에서 제네릭이란 데이터의 타입을 일반화하는 것을 의미한다. 즉, 클래스나 메서드에서 사용할 내부의 데이터 타입을 컴파일 시에 미리 지정하는 방법이다. 이는 아래의 2가지 장점을 가진다. 1. 클래스나 메서드 내부에서 사용되는 객체의 타입 안정성을 높일 수 있다. 2. 반환값에 대한 타입 변환 및 타입 검사에 들어가는 노력을 줄일 수 있다. 어노테이션(Annotation) Java 소스 코드에 추가하여 사용할 수 있는 메타데이터의 일종으로 @ 기호를 앞에 붙여서 사용한다. 어노테이션은 클래스 파일에 임베디드되어 컴파일러에 의해 생성된 후 JVM에 포함되어 작동한다. 어노테이션의 용도 1. 컴파일러에게 코드 작성 문법 에러 체크하도록 정보를 제공. 2. 소프트웨어 개발 툴이 빌..

JVM (Java Virtual Machine) JVM은 Java 어플리케이션을 클래스 로더(Class Loader)를 통해 읽고, Java API와 함께 실행하는 역할을 한다. Java는 물리적인 Machine과 별개인 가상 Machine을 기반으로 동작하도록 설계되었다. 따라서 Java 바이트코드를 실행하고자 하드웨어에 JVM을 동작시킴으로서 Java 실행코드를 변경하지 않고도 모든 종류의 하드웨어에서 동작이 가능하도록 한 것이다. Java 프로그램의 실행 과정 1. 프로그램이 실행되면 JVM은 OS로부터 프로그램이 필요로 하는 메모리를 할당받는다. JVM은 할당받은 메모리를 용도에 따라 여러 영역으로 나누어 관리한다. 2. Java 컴파일러(javac)가 자바 소스코드(.java)를 읽어 Java ..

Filter와 Interceptor의 차이 Spring은 공통적으로 여러 작업을 처리함으로써 중복된 코드를 제거할 수 있도록 많은 기능들을 지원한다. Filter Filter는 J2EE 표준 스펙 기능으로 Dispatcher Servlet에 요청이 전달되기 전/후에 URL 패턴에 맞는 모든 요청에 대해 부가작업을 처리할 수 있는 기능을 제공한다. Dispatcher Servlet은 프론트 컨트롤러이므로 Spring 컨테이너가 아닌 웹 컨테이너에 의해 관리된다. 즉, Filter는 Spring의 범위 밖에서 처리된다. Filter를 추가하기 위해서는 javax.servlet의 Filter 인터페이스를 구현해야 한다. public interface Filter { public default void init..

DI(Dependency Injection) 방법 1. 필드 주입(Field Injection) @Autowired 어노테이션을 통해 의존성을 주입하는 방법이다. class A { @Autowired private B b; } 2. 생성자 주입(Constructor Injection) 생성자를 통해 의존성을 주입하는 방식으로 가장 권장되는 주입 방식이다. class SampleClass { private final Sample sample;// final 사용 가능 @Autowired public SampleClass(Sample sample) { this.sample = sample; } } 3. 수정자 주입(Setter Injection) Setter 메서드를 통해 의존성을 주입하는 방식이다. cla..

IoC(Inversion of Control) IoC를 그대로 해석하면 제어의 역전이다. 이는 개발자가 가지고 있던 제어권이 외부의 컨테이너에 넘어가서 객체의 생성, 라이프사이클 관리와 같은 객체에 대한 제어권이 바뀜을 의미한다. 제어권이 컨테이너로 넘어감에 따라, DI(의존성 주입), AOP(관점 지향 프로그래밍)등이 가능해진다. IoC 컨테이너 Spring에서 객체를 생성하고 의존성을 관리해주는 컨테이너로서, 인스턴스의 생성부터 소멸까지의 Life Cycle 관리를 수행하기 때문에 개발자들이 비즈니스 로직에 집중할 수 있도록 해준다. DI(Dependency Injection) DI는 의존성 주입이라는 뜻으로, 객체 간의 의존성을 개발자가 아닌 외부에서 주입하는 것이다. Spring의 경우 IoC 컨..