
서블릿이란 자바를 이용하여 웹 페이지를 생성하는 개념으로 HTML을 이용하여 클라이언트에게 데이터를 전송하고 데이터베이스와 상호작용하고 로직 처리 등 복잡한 작업을 수행할 수 있다 서블릿은 크게 아래 순서의 작동 원리를 갖는다 1. 클라이언트 요청: 웹 브라우저가 HTTP요청을 서블릿에 전송 2. 웹 서버: 요청을 받은 웹 서버는 해당 요청을 처리할 서블릿을 찾아서 호출 3. 서블릿 실행: 서블릿은 요청을 처리한 후, 결과를 HTTP응답 형태로 웹 서버에 전달 4. 응답 전송: 웹 서버는 서블릿으로부터 받은 응답을 클라이언트에게 전송 서블릿의 편리성 Servlet이 개발자에게 어떤 편리성을 주는지 알아보자 아래와 같이 username을 브라우저로부터 입력받아서 post방식으로 서버에 요청하는 HTML F..
웹 서버 웹 서버는 HTTP를 기반으로 동작하며 우리가 흔히 사용하는 크롬 브라우저, 엣지, 사파리 등의 클라이언트(사용자)로부터 HTTP요청을 받아 단순 HTML, CSS, JS, 이미지 파일들 즉 정적 컨텐츠들을 제공하는 서버이다 웹 서버는 브라우저(클라이언트)의 요청을 받아서 단순히 정적 컨텐츠를 제공하는 것이라면 해당 컨텐츠를 제공해주고 만약 웹 애플리케이션 서버의 도움이 필요하다면 브라우저로부터 받은 요청을 웹 애플리케이션 서버에 전달하는 역할을 수행하기도 한다 예를 들어서 사용자가 웹사이트에 로그인하기 위해서 로그인하러가기 링크를 통해서 사용자에게 로그인 폼을 제공해주는 것은 단순 HTML과 CSS, JS만으로 처리가 가능하기 때문에 이 때는 웹 서버가 컨텐츠를 제공해준다. 사용자가 로그인 폼..

스프링 컨테이너란 순수 Java만으로는 객체지향 설계원칙인 SOLID중 OCP(개방-폐쇄 원칙)와 DIP(의존관계 역전 원칙)을 지킬 수가 없게된다. OCP와 DIP를 지키기 위해서는 누군가가 객체에 의존성을 주입해주어야 하는데 그 누군가가 바로 스프링 컨테이너이다. 스프링 컨테이너는 객체를 Component(Bean)으로 만들어 직접 관리하며 객체에 의존성이 필요한 클래스에게 직접 의존성을 주입해준다 이것이 바로 DI(Dependency Injection)이다. 스프링 컨테이너를 이용하여 OCP, DIP를 완전하게 지키며 비로서 완벽한 객체지향 설계원칙을 지키게 된다. 객체지향 설계원칙을 지켜 기획, 요구사항에 변경이 발생하더라도 클라이언트 코드의 수정없이 오로지 스프링컨테이너 설정 코드(@Config..

SOLID SOLID란 Clean Code의 저자로 유명한 로버트 마틴이 정의한 좋은 객체지향 설계의 5가지 원칙을 정리한 것이다. - SRP: 단일 책임 원칙 - OCP: 개방-폐쇄 원칙 - LSP: 리스코프 치환원칙 - ISP: 인터페이스 분리 원칙 - DIP: 의존관계 역전 원칙 5가지의 원칙을 하나씩 알아가보도록 하자 단일 책임원칙 - SRP(Single Responsibility Principle) SRP는 한 클래스는 하나의 책임만 가져야 한다는 것이다. 이 말만으로는 SRP가 무엇인지 와닿지 않는데, 예를 들어서 설명해본다면 어떤 프로젝트에서 UI하나를 고쳤는데 그 안에 SQL, 로직 등 여러가지의 것들을 같이 변경해야한다면 그것은 SRP원칙이 잘 이루어지지 않은 코드이다. 즉, SRP가 잘..

스프링등장의 배경 스프링이던 어떤 기술이던 해당 기술의 핵심을 알고, 그 핵심을 이해해야한다 예를 들어서 어떤 프레임워크가 나왔다면 이 프레임워크의 등장 배경에는 무엇이 있었는가? 어떤 점이 불편해서 기존의 것을 사용하지않고 새로운 기술을 탄생하게 했는가? 등의 궁금증을 품다보면 이 기술의 등장 원인을 알게 되고 그 기술의 핵심을 알게되는 것이다. 이러한 과정으로 기술의 핵심을 알고 제대로 이해해야 비로소 이 기술을 옳바르게 사용하고 있다고 할 수 있는것이다. 그렇지 않다면 그냥 API의 사용법만 알고 사용하는 것에 그친다 본론으로 돌아와 스프링은 Java언어 기반의 프레임워크로 Java언어의 특징인 객체지향 특징을 극대화 시켜주는 프레임워크이다 즉, 좋은 객체지향 어플리케이션을 개발할 수 있도록 도와주..
![[백준] 2562 - 최댓값](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fu7I3q%2Fbtsy8k4Riyc%2FI31gEyLwdxgSX3EQ0namD1%2Fimg.png)
문제 접근방법 & 풀이 해결해야 할 부분은 1. 최대값 찾기 2. 최대값의 인덱스위치 찾기 두 가지 입니다. 최대값 찾기는 이전 문제에서도 구현했듯이 배열의 인덱스 값들을 for문으로 비교해가며 배열 중 가장 큰 값을 max변수에 저장하는 것입니다. 동시에 해당 for문 안에서 count변수에 i+1의 값을 저장해주면 간단하게 최대값의 인덱스위치도 찾을 수 있습니다. 이 때 i+1인 이유는 인덱스는 0부터 시작하기때문에 +1을 해줍니다. for(int i=0; i max) { max = arr[i]; count = i+1; } } 코드 import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner ..
![[백준] 10818 - 최소, 최대](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxmDWg%2Fbtsy3Nm9cWc%2FzBuOePChiqYmT5qmXlikek%2Fimg.png)
문제 접근방법 & 풀이 최대값과 최소값을 구하는 문제입니다. 먼저 배열의 길이를 N으로 설정해주고, for문을 통해 N길이 배열의 값을 인덱스에 넣어줍니다. 이후 최대값은 max, 최소값은 min으로 변수를 선언해주고 해당 변수들을 배열의 첫번째 인덱스 값으로 초기화 해줍니다. int max = arr[0]; int min = arr[0]; max와 min의 값을 0이 아니라 인덱스의 첫번째 값으로 초기화해주는 이유는 코드를 직접 머리속으로 돌려보시면 알 수 있습니다. min의 값을 0으로 초기화해준다면 0은 양수 중에서 가장 작은 값이기때문에 어떤 값과 비교를 해도 min은 0이되기 때문입니다. 그 다음 each for문을 사용하여 값을 비교하고 최대값과 최소값을 추출해내는 구문입니다. for(int ..
![[백준] 10871 - X보다 작은 수](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlrRa2%2Fbtsy5cGjzc8%2FayI5VeenNeWMGbVqXvq9y0%2Fimg.png)
문제 접근방법 & 풀이 [백준] 10807 - 개수 세기 • 문제 배열을 이용하여 해당 배열에 값을 넣어 특정 값이 몇 개인지 개수를 출력하는 프로그램이다. • 풀이 입력 - 배열에 들어갈 숫자의 개수인 N - 배열의 인덱스에 들어갈 값 - 개수를 알기 lee-dev-log.tistory.com 이전 문제인 개수 세기와 매우 유사한 문제이지만 X값과 비교하여 작을 때의 값을 출력하는 문제이다. 이전 문제에서는 count변수에 요구되는 값과 일치하는 값만큼 count++을 해주는 문제였지만 이번 문제는 X보다 작은 값을 바로 출력하는 문제다. for(int i=0; i