최근 SSAFY에서 프로젝트 회고를 하며 Jenkins, Nginx 등 특정 기술을 사용한 이유를 정리할 기회가 있었습니다. 그러다 MySQL, Spring을 거슬러 웹 개발을 위한 언어로 JAVA를 선택한 이유를 떠올려봤습니다. 졸업프로젝트를 하며 비즈니스 로직 설계하는 백엔드에 흥미를 느꼈지만, 처음 접한 자바스크립트 + Express.js보다는 Java + Spring을 택했습니다. 전공자로서 자바 프로그래밍, 네트워크 프로그래밍 등의 수업에서 자연스럽게 노출되었고 대한민국 백엔드풀은 자바가 압도적이라 선택했습니다만 시장에서 이런 점유율을 차지할 수 있던 이유는 개발자가 서비스 자체에 집중해줄 수 있게 해줘서 인것 같습니다. 1. Write once, run anywhere를 위한 JVM으로 운영체..
스프링부트로 스프링을 접해서 몰랐는데 레거시 스프링을 접하게 되면서 정말 스프링부트는 미쳤다는 걸 체감하고 있다. 서블렛 컨테이너 등록 VS 내장 서블렛 컨테이너 레거시는 별도의 서블렛 컨테이너(웹 애플리케이션 서버)를 미리 준비하고 그 위에 스프링 프로젝트를 올린다. 이후 빌드할 때도 war파일을 서블렛 컨테이너에 올려야 한다. 스프링부트는 기본적으로 서블렛 컨테이너가 내장되어 있어 별도의 서버 설치 없이 실행할 수 있다. 빌드시에도 jar 파일만으로 배포할 수 있다. web.xml spring legacy 프로젝트 생성시 자동으로 생성되긴 하지만 web.xml에 ContextLoaderListener를 통해 Dispatcher Servlet을 서블렛 컨테이너(톰캣)에 올리는 것을 명시한다. POST ..
빌드 소스코드를 실행가능한 독립적인 소프트웨어 산출물로 만드는 과정으로 코드를 서버에 올릴 수 있는 상태로 만드는 것 빌드과정 컴파일 : 소스코드(.java)를 바이너리 코드(.class)로 변환 링크 : 클래스 파일들끼리 연결(외부 라이브러리 포함) 패키징 : 연결된 클래스 및 리소스 파일 연결 테스트 : 기능 테스트 빌드 결과 JAR(Java Archive) : 자바애플리케이션 압축 양식, 클래스와 리소스로 구성 WAR(Web Archive) : 웹 애플리케이션 압축 양식 원래 웹 기능이 들어간 자바 애플리케이션은 WAR로 빌드해야하지만 스프링부트는 내장 톰캣을 통해 JAR로 빌드할 수 있게한다. 빌드툴 소스코드의 빌드 과정을 자동으로 처리해주며 외부 라이브러리 의존성 추가 및 관리를 해주는 프로그램..
오버라이딩이란? 상위 클래스에서 이미 정의된 메소드를 상속받는 하위 클래스에 맞춰서 메소드 오버라이딩을 통해 재정의하는 것 오버라이딩 시에 @Override 어노테이션 필수인가? 메소드 오버라이딩은 동적 할당으로 런타임시에 실행되는데 @Override 어노테이션을 오버라이딩 하는 메소드에 붙여주면 컴파일 시점에 상위클래스가 해당 메서드명을 갖고 있는지, 파라미터는 동일한지를 체크해줄 수 있다. class People{ public void sayMe(){ System.out.println("난 사람"); } } class Chulsu extend Poeple{ public void sayMee(){ // 메소드 오버라이딩 안되지만, 컴파일 시점에 체크하기 어려움 System.out.println("난 철..
인터페이스가 가진 객체지향의 특징 캡슐화, 추상화, 다형성, 상속성 그렇게 생각한 이유는? 1. 캡슐화 : 인터페이스의 구현체가 메소드를 어떻게 구현하는지 모르지만, 추상 메서드를 사용 2. 추상화 : 객체에서 특성을 제외하고 기능만이지만 추상화를 사용해 인터페이스 정의 3. 다형성 : 인터페이스를 구현할 때는 추상화 메서드를 반드시 구체화시켜야하는데 이 과정에서 메소드 오버라이딩 발생 구현체의 인스턴스의 참조변수로 구현체가 아닌 추상화된 인터페이스를 사용 가능 4. 상속성 : 인터페이스의 구현체는 인터페이스의 기능들을 재사용
캡슐화 객체지향세상에선 객체에게 상태를 얻어내는게 아닌 할일을 맡기고 결과물을 얻는다. 이때 할일을 맡길 때 해당 객체가 어떤 과정을 거치는 지는 알 필요도 없고 상황에 따라 접근도 불가해야한다. 자바에선 접근제한자로 필드나 메소드의 접근을 컨트롤하고, 상속이나 인터페이스 같이 구체화 된 객체를 생성하고 추상화에 의존해서 구현체가 어떻게 동작하는지 모른채로 추상메서드 이용 등이 있다. 추상화 객체지향세상에서는 객체를 서비스의 관심영역에 맞게 특징을 뽑아내 인스턴스의 설계도인 클래스로 만든다. 만약 은행 서비스를 만든다면 사용자는 '사람' 에서 은행에 돈을 맡길 '고객'의 특징을 뽑아내는 추상화 과정을 진행한다. 자바에선 클래스를 만들때 해당 클래스에 맞는 필드나 메소드를 정의하는 일이 된다. 다형성 자바..
입출력 외부 데이터는 자바 프로그램 외부에 존재하는 모든 데이터를 의미 하드 디스크상의 프로그램, 네트워크 상의 리소스, 메모리에 있는 자바 프로그램을 제외한 리소스 모두 외부 데이터 외부 데이터의 타입이 무엇이든 외부 데이터를 읽기나 쓰기 작업 시에 java.io나 java.nio의 객체를 사용 IO API Input ~InputStream (1바이트), ~Reader(2바이트) 로 끝나는 객체는 외부 데이터를 읽어오는 기능을 가진 입력 스트림 Output ~OutputStream, ~Writer로 끝나는 객체는 외부로 데이터를 출력하는 기능을 가진 출력 스트림 스트림 객체에서 Stream, Reader, Writer를 제외한 부분이 외부 데이터 타입을 가리킴 표준 입출력 입출력 대상을 지정하지 않았을..
IO의 보충제, NIO 자바는 JVM 위에서 작동해서 메모리에 올라간 데이터를 JVM메모리로 카피해오는 과정이 껴있어 직접 운영체제 레벨의 시스템콜을 사용하는 것 보다 느리다. 자바4에 NIO가 출시되고 자바 7에 클래스 설계 및 비동기 채널 등의 업데이트가 이루어진 NIO 2.0가 NIO의 하위 패키지에 포함된다. IO와 NIO의 차이점 Stream vs Channel IO 입력, 출력을 위해 각각의 Stream을 만들고 1바이트씩 처리하는 Stream 기반 NIO 채널 기반으로 하나의 채널로 양방향 입출력이 가능 Non-Buffer vs Buffer IO 1바이트 쓰기와 읽기의 조합으로 데이터를 주고 받음, 보조 스트림인 BufferedStream을 연결해서 사용하기도 함 NIO 버퍼를 사용해 복수개..