장르: 애초에 역경을 딛고 이룩하는 숭고한 사랑이란 없다. 그 역경 자체가 사랑이다.
프로그램 특징: 그 곳에서 살아남는 사랑이 어떤 모습으로 걸어오는지 기다려 보고 싶다.
Frontend | Transfer(http) | Backend | ||
Client(Browser) | HTTP Request Header 요청 메타정보, 주소(URL) |
웹서버 HTTP에 의한 단순한 요청 HTML 처리 HTML 아닌 요청(API, DB)⇢ |
WAS 요청에 대해 JAVA로 DB 처리 같은 특정 처리하는 프로그램 DB로 SQL 요청 ⇢ ⇠ 웹서버에 HTML 반환 |
DB ⇠ 요청 값에 대해 결과 반환 |
Request Body POST (JSON, Form) |
||||
HTTP Response Header Status Code(200) |
||||
Response Body HTML, JSON: API 응답 결과 |
웹을 크-게 보면 클라이언트의 요청 [Client (PC/Mobile)] ⇢ [HTTP Server (Vue/React + Router)] ⇢ [Application Server (Spring)] ⇢ [DB Server] 을 거쳐 데이터를 받아 반환하는 과정이라 볼 수 있다.
웹에서 데이터를 받아와 처리하기 위한 프로그램은 자바로 짜여져 있다. 그래서 자바를 배워야 한다.
자바로 짠 프로그램이 어떻게 데이터를 받아오는지 자세히 보기 위해 게시판 목록을 불러오는 예제로 확인해보자.
- 클라이언트의 요청 [Client (PC/Mobile)]
- 사용자가 브라우저로 요청(ex. 게시글 목록 보기)을 함.
- Vue.js 앱에서 axios.get('/api/posts') 같은 요청을 보냄.
- [HTTP Server]
- Vue 라우터가 클라이언트 사이드 라우팅 처리
- 요청 주소는 HTTP 서버로 전달됨(이 서버는 static 파일을 서빙하거나, 프록시 설정된 경우 API 요청을 백엔드로 넘김)
- routing: 클라이언트에서 들어오는 요청에 따라 그에 맞는 함수 처리:
입력 URL에 따라 다른 내용을 보여주거나 GET, POST 등 method에 따라 처리할 함수를 다르게 연결할 수 있다.
- routing: 클라이언트에서 들어오는 요청에 따라 그에 맞는 함수 처리:
- [Web Application Server]
- HTTP 요청이 Spring의 Front Controller (DispatcherServlet)에 도달
- [Front Controller -> HandlerMapping] URL에 맞는 Controller 요청
- 요청 URL을 보고 HandlerMapping이 적절한 Controller를 찾음
- [Controller → Service 호출] 비즈니스 로직이 있는 Service 호출
- [Service → DAO(MyBatis Mapper) 호출] 필요한 데이터를 DB에 질의
- HandlerMapping은 URL을 Controller에 매핑하는 역할
- Controller는 HTTP request 처리의 시작점 역할
- Service는 개인이나 기업이 지정한 비즈니스 로직(암호화 등) 수행하는 역할
- DAO: Data Access Object DB에 값을 저장하고, DB에서 값을 꺼내 controller나 service 객체에 전달하는 역할
- [DB Server]
- [DAO → DB] SQL 실행과 데이터 조회
- [DB → DAO → Service → Controller]
SQL 쿼리를 처리한 결과를 상위 계층으로 전달
- [Application Server → HTTP Server → Client]
-
-
- [Controller → Front-Controller(DispatcherServlet)] 결과 데이터를 JSON 또는 객체로 반환
- [DispatcherServlet → ViewResolver] 화면(View)을 렌더링할 템플릿 결정 (ex. Thymeleaf, JSP)
- [ViewResolver → View → DispatcherServlet] 렌더링된 HTML 생성
- [DispatcherServlet → WAS → Client] 최종 HTML 또는 JSON 데이터를 response로 전송
-
웹 서버를 만들고 접속했을때 HTML "페이지"를 보여주는 방식을 HTML페이지 serving한다고 한다. 페이지를 서빙하려면 res 객체에서 헤더를 만들때 Content-Type 속성을 text/html로 지정한다. 그리고 읽기 스트림로 index.html을 읽어와 파이프로 연결한다.
DB에서 자료를 처리하는 작업은 주로 Create, Read, Update, Delete로 이를 CRUD라 부른다. 자료를 가져와 사용하거나 변형하는 작업은 CRUD를 작성한다는 것이고 이는 API를 만든다는 것과 같은 말이다.
그렇다면 CRUD RESTful API 은 뭘까
HTTP 프로토콜을 활용해 자료를 주고 받기 위해 약속된 구조를 REST라고 한다.
REST(REpresentational State Transfer) : 데이터의 현재 상태를 볼 수 있게 나타낸 규칙.
예를 들어 클라이언트가 DB에서 값을 받아오는 방식이 API 이고, 이 API를 사용할 때 사용하는 통일된 양식을 REST라고 한다. REST를 잘 지켜서 개발한 API를 REST API라고 한다. REST API는 URL로 웹에 있는 자원에 접근하는 것을 기본으로 한다.
http://localhost:8000/posts/posts-edit/10
↓프로토콜 ↓도메인 ↓포트 ↓source ↓:id 인자
- 자원명은 명사형으로 알파벳 소문자를 이용한다.
- 자원명은 케밥 스타일( - )을 이용한다. _는 사용하지 않는다.
- 계층은 / 로 분리하되 URL 끝은 슬래시를 붙이지 않는다.
- 자원 처리 방법(CRUD)는 자원명에 사용하지 않는다. (get-posts ❌)
JAVA 공화국이 된 이유
플랫폼 독립적: 개발자 입장에서 Write Once, 사용자 입장에서 Run Anywhere(WORA)
- JVM과 바이트코드 덕분
- C++과 동일하게 객체지향이지만, 한 번 컴파일되면 모든 OS에서 실행가능하다. 앱을 다운받아서 쓰는 입장에선 무슨 말인지 이해하기 어렵다. 사용자가 실행하는 환경에서 실행 가능한 앱을 만들기 위한 입장에서 생각해보자. 컴퓨터에서 실행가능하려면 0과 1로 구성된 기계어 수준으로 번역 과정을 거쳐줘야 한다. 이때 기계어는 실행되는 환경(OS)에 따라 문법이 다르기 때문에 OS가 다르면 실행을 위해 컴파일을 다시 해줘야 할 번거로움이 생길 수 있다. 자바 컴파일로 생성된 바이트 코드는 특정 운영체제에 종속되지 않는 중간형태이다. 보통 컴파일로 생성된 파일은 기계어로 번역하기 직전 단계이므로 완성 형태? 라고 봐야한다. 자바는 바이트코드가 JVM을 통해 실행되므로, 운영체제에 맞는 JVM을 설치해주면 자바 바이트 코드 파일 하나로 여러 운영체제에서 실행이 가능해진다. 따라서 운영체제에서 번역해서 실행하도록 하는 JVM은 운영체제별로 다르게 설치된다.
참고) cpp는 컴파일 후 링킹 과정을 거쳐서 실행 파일(exe)이 된다.
출처)
C/C++ 대규모 프로젝트에서 빌드 속도를 올려보자 | 요즘IT
커피 한잔을 앞에 두고 비주얼 스튜디오 2019에서 ‘F7’키나 ‘Ctrl + Alt + F7’키를 누른 후, 올라가는 프로그레스바를 무심히 바라보신 기억이 있으신 분들께 이 글을 올립니다.
yozm.wishket.com
- 자바 대체할 순 없을까? 빠르고 쉬운 실행을 지향하면서 스프링과 호환되는 객체지향 언어를 찾는 중 -> 코틀린?
- 객체지향은 부품을 찾아서 코딩한다고 비유할 수 있다.
자바로 개발을 위해 필요한 도구
- JDK(Oracle JDK, Open JDK)
- IDE(IntelliJ, Eclips)
- Build System (IntelliJ, Maven, Gradle)
JDK(개발 키트)에서 코딩해서 javac로 컴파일을 한다. 생성된 바이트 코드는 JRE(런타임 환경)에서 실행된다. JRE 내부 JVM, JIT 컴파일러로 구성되며 (실행엔진) JVM에서 바이트 코드를 기계어로 변환해 프로그램을 실행한다.
- JIT컴파일러에 의해 실행최적화, 앞서 기계어로 변환된 것은 다시 변환하지 않음.
👇메모리 관점 JVM 런타임 영역 동작 방식
[JAVA] JVM 런타임 영역 동작
JVM은 운영체제에서 할당 받은 메모리 영역을 메소드 영역, 힙 영역, 스택 영역으로 구분해서 사용한다.메소드 영역: 바이트코드 파일을 읽은 내용이 저장되는 영역스택 영역: 메소드를 호출할
ahranah.tistory.com
컴파일을 포함한 전체 빌드 과정(실행 가능한 프로그램으로 만들어주는 과정)을 자동화하고 관리하기 위해 빌드시스템을 이용한다.
빌드 시스템의 역할
- 소스 코드 작성: 개발자가 .java 파일을 작성
- 컴파일 단계: 빌드 시스템이 내부적으로 javac를 호출하여 소스 코드를 컴파일
- 테스트 실행: 작성된 테스트 코드를 자동으로 실행
- 패키징: 컴파일된 .class 파일과 리소스를 .jar 또는 .war 파일로 묶어.
- 배포: 패키징된 파일을 서버나 저장소에 배포
이미지 출처)
[Chapter03] Java 컴파일 과정
Java 컴파일 과정에 대해 다뤘습니다.
velog.io
환경 변수 설정하는 이유
- JAVA_HOME: jdk 설치 위치 <- IDEA에서 자바 설치 위치 인식
- PATH: 프로그램에서 명령어의 위치(bin)로, 어디서든 실행할 수 있도록 하기 위함
'KB_ITs_Your_Life_6th' 카테고리의 다른 글
[Node.js][MongoDB] MVC 모델의 Controller 작성하기 (0) | 2025.04.21 |
---|---|
MVC 모델에서 모델[MongoDB]과 컨트롤러 연결하기 (0) | 2025.04.21 |
[Node.js] 비동기처리 동작을 이해해보자 (1) | 2025.03.25 |
[Node.js] 파일 관리 - path, File System 모듈 (0) | 2025.03.21 |
[Vue.js] Vue 기초 (1) | 2025.03.20 |