SQL의 실행과정을 아십니까..? SQLD를 공부할 때까진 이것만 생각했었습니다. 하지만 친절한 SQL 책을 읽으면서 DBMS에 쿼리를 날리면 어떤 과정을 통해 결과집합을 얻는지 배울 수 있었습니다. sql 실행 과정우선 SQL은 절차적인 언어가 아닌 Structured Query Language로 구조적 질의 언어입니다. 원하는 결과집합을 구조적으로 질의하지만 결과집합을 만들어내는 과정은 절차적으로 수행해야하고 아래와 같은 과정을 거칩니다. SQL에 문법적, 의미상 오류가 없는지 체크하는 파싱최적화 하기 쉬운 형태로 쿼리 변환을 하고 다양한 후보군이 될만한 실행계획 생성 및 비용 계산 실행엔진이 실행할 수 있는 프로시저로 변환하는 과정프로시저 실행 후 결과반환 SQL 파싱원래 DBMS는 I/O작업을 많..
최근 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를 제외한 부분이 외부 데이터 타입을 가리킴 표준 입출력 입출력 대상을 지정하지 않았을..