day59 πŸŒ•

μž₯λ―ΈΒ·2022λ…„ 8μ›” 11일
0

였늘의 μ„±κ³Ό

λͺ©λ‘ 보기
59/129

μΈν”„λŸ° μ§€λ‚œ κ°•μ˜ μˆ˜κ°• 및 정리!!!

βœ”οΈ [μŠ€ν”„λ§ MVC 2편 - λ°±μ—”λ“œ μ›Ή 개발 ν™œμš© 기술] μ„Ήμ…˜ 7 μˆ˜κ°• 및 정리 μ™„λ£Œ
βœ”οΈ [μŠ€ν”„λ§ MVC 2편 - λ°±μ—”λ“œ μ›Ή 개발 ν™œμš© 기술] μ„Ήμ…˜ 8 μˆ˜κ°• 및 정리 μ™„λ£Œ


ν† ν”½ 1개 - Spring Servlet

μ„œλΈ”λ¦Ώμ΄ μ—†λ˜ μ‹œμ ˆ, 초창기의 μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ ν΄λΌμ΄μ–ΈνŠΈκ°€ μš”μ²­ν•˜λ©΄ html 파일과 같은 정적인 λ°μ΄ν„°λ§Œ μ œκ³΅ν•  수 μžˆμ—ˆλ‹€.
즉, μ‚¬μš©μžλ§ˆλ‹€ λ‹€λ₯Έ 화면이 μ•„λ‹Œ μ „λΆ€ λ™μΌν•œ ν™”λ©΄λ§Œ 제곡 λ°›μ•˜λ‹¨ μ†Œλ¦¬λ‹€.

정적 μ»¨ν…μΈ λ§Œ μ œκ³΅ν•˜λ‹€ λ³΄λ‹ˆ μ‚¬μš©μžλ“€μ—κ²Œ λ‹€μ–‘ν•œ 화면을 보여주기가 νž˜λ“€μ—ˆκ³ , 이둜 인해 동적 컨텐츠 제곡의 ν•„μš”μ„±μ„ 느끼게 λ˜μ—ˆλ‹€.
κ·Έλž˜μ„œ λ‚˜μ˜¨ 것이 CGI(Common Gate Interface)이닀. CGIλŠ” 동적인 데이터λ₯Ό μ œκ³΅ν•˜κΈ° μœ„ν•œ κ·œμ•½μ„ λ§ν•œλ‹€.

μ„œλ²„λŠ” CGIλ₯Ό κ΅¬ν˜„ν•œ κ΅¬ν˜„μ²΄μ—κ²Œ 동적인 데이터λ₯Ό μ œκ³΅ν•΄ 달라고 μš”μ²­ν•œλ‹€. CGI κ΅¬ν˜„μ²΄κ°€ 이λ₯Ό μˆ˜ν–‰ν•΄ κ²°κ³Όλ₯Ό μ „λ‹¬ν•¨μœΌλ‘œμ¨ ν΄λΌμ΄μ–ΈνŠΈλŠ” 동적인 데이터λ₯Ό 제곡 받을 수 있게 λœλ‹€.

ν•˜μ§€λ§Œ CGI κ΅¬ν˜„μ²΄λŠ” λͺ¨λ“  μ‚¬μš©μž μš”μ²­λ§ˆλ‹€ ν”„λ‘œμ„ΈμŠ€λ₯Ό μ‚¬μš©ν•΄μ„œ μš”μ²­μ„ μ²˜λ¦¬ν•˜κΈ° λ•Œλ¬Έμ— λ¬Έμ œκ°€ μžˆλ‹€. 무겁고, μƒμ„±λ˜λŠ” μ‹œκ°„μ΄ 였래 κ±Έλ € μ„œλ²„κ°€ λ§Žμ€ λ¦¬μ†ŒμŠ€λ₯Ό λΆ€λ‹΄ν•΄μ•Ό ν•œλ‹€.
λ˜ν•œ, 같은 μš”μ²­μ΄λΌλ„ λ™μΌν•œ CGI κ΅¬ν˜„μ²΄λ₯Ό μƒμ„±ν•œλ‹€λŠ” 문제점이 μžˆλ‹€.

μ΄λŸ¬ν•œ λ¬Έμ œμ μ„ ν•΄κ²°ν•˜κΈ° μœ„ν•΄ λ°”λ‘œ Servlet이 λ“±μž₯ν•˜μ˜€λ‹€.


Servlet

μ„œλΈ”λ¦Ώμ€ 동적 데이터λ₯Ό μ œκ³΅ν•˜κΈ° μœ„ν•΄ CGIλ₯Ό 기반으둜 μ œμž‘ν•œ ν”„λ‘œκ·Έλž¨μ΄λ‹€.
μ„œλΈ”λ¦Ώμ€ μ•žμ„œ λ§ν•œ 문제λ₯Ό λ‹€μŒκ³Ό 같이 ν•΄κ²°ν•΄ μ€€λ‹€.

각 μš”μ²­λ§ˆλ‹€ ν”„λ‘œμ„ΈμŠ€λ₯Ό 맀번 μƒμ„±ν•˜λ˜ 것을 μŠ€λ ˆλ“œλ‘œ λ³€κ²½ν•˜μ˜€λ‹€. μŠ€λ ˆλ“œλ‘œ μž‘μ—…ν•˜κΈ° λ•Œλ¬Έμ— μ„œλ²„μ—μ„œ λ§Žμ€ λ¦¬μ†ŒμŠ€λ₯Ό μ†Œλͺ¨ν•˜λŠ” λ¬Έμ œκ°€ ν•΄κ²°λ˜μ—ˆλ‹€.

λ˜ν•œ, λ™μΌν•œ μš”μ²­μ—λ„ 맀번 κ΅¬ν˜„μ²΄λ₯Ό μƒμ„±ν•˜λ˜ 이전과 달리 싱글톀 νŒ¨ν„΄μ„ μ μš©ν•΄ ν•˜λ‚˜μ˜ κ΅¬ν˜„μ²΄λ₯Ό μž¬μ‚¬μš©ν•˜λ„λ‘ ꡬ쑰λ₯Ό λ³€κ²½ν•˜μ˜€λ‹€.

이둜 인해 μ„œλ²„κ°€ λΆ€λ‹΄ν•΄μ•Ό ν•  λ¦¬μ†ŒμŠ€λ₯Ό μ€„μ΄λ©΄μ„œ, ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ 동적 데이터λ₯Ό 효율적으둜 μ œκ³΅ν•  수 있게 λ˜μ—ˆλ‹€.

Servlet μ‚¬μš©μœΌλ‘œ μΈν•œ 이점
기본적으둜 μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μš”μ²­μ„ 보낼 땐 HTTP λ©”μ‹œμ§€λ‘œ 톡신을 ν•œλ‹€. HTTP λ©”μ‹œμ§€λ₯Ό μ„œλ²„κ°€ λ°›μœΌλ©΄ 각 μ˜λ―Έμ— 맞게 νŒŒμ‹±ν•˜μ—¬ μ²˜λ¦¬ν•œ ν›„, 응닡 HTTP λ©”μ‹œμ§€λ₯Ό λ§Œλ“€μ–΄μ„œ ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ μ „λ‹¬ν•œλ‹€.
ν•˜μ§€λ§Œ κ°œλ°œμžκ°€ 일일이 μš”μ²­ 값을 νŒŒμ‹±ν•˜μ—¬ 응닡 λ©”μ‹œμ§€λ₯Ό λ§Œλ“€μ–΄ 쀄 μˆ˜λŠ” μ—†λ‹€. 이것은 λ„ˆλ¬΄ 번거둜운 일이닀.

μ„œλΈ”λ¦Ώμ€ κ°œλ°œμžκ°€ μ΄λŸ¬ν•œ νŒŒμ‹± μž‘μ—…μ„ 일일이 ν•˜μ§€ μ•Šλ”λΌλ„, APIλ₯Ό 톡해 μ œκ³΅λ°›μ„ 수 μžˆλ„λ‘ λ§Žμ€ κΈ°λŠ₯듀을 μ œκ³΅ν•˜κ³  μžˆλ‹€. (addCookie, sendRedirect λ“±)
λ˜ν•œ, HTTP λ©”μ„œλ“œμ— λŒ€ν•œ λΆ„κΈ°μ²˜λ¦¬λ„ 각 μš”μ²­λ³„λ‘œ λŒ€μ‹  μ²˜λ¦¬ν•΄ μ€€λ‹€.

@WebServlet(name = "servletExample", urlPatterns = "/example")
public class ServletExample extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
		super.doGet(req, resp);
		//λΉ„μ¦ˆλ‹ˆμŠ€ 둜직
	}
}

즉, κ°œλ°œμžλŠ” μ΄λŸ¬ν•œ μš”μ²­λ“€μ„ μ²˜λ¦¬ν•΄ μ£ΌλŠ” λ©”μ„œλ“œλ₯Ό μž¬μ •μ˜ν•˜κ³  APIλ₯Ό μ‚¬μš©ν•œ λ’€, μš”μ²­ 받을 URL만 맀핑해 μ£Όλ©΄ μ›ν•˜λŠ” λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ μž‘μ„±ν•˜κ³  μ‹€ν–‰ν•  수 μžˆλ‹€.

Servlet의 λ™μž‘ 방식

  1. μ‚¬μš©μžκ°€ URL을 ν΄λ¦­ν•˜λ©΄ HTTP Requestλ₯Ό μ„œλΈ”λ¦Ώ μ»¨ν…Œμ΄λ„ˆλ‘œ μ „μ†‘ν•œλ‹€.
  2. HTTP Requestλ₯Ό 받은 μ„œλΈ”λ¦Ώ μ»¨ν…Œμ΄λ„ˆλŠ” HttpServletRequest, HttpServletResponse 객체λ₯Ό μƒμ„±ν•œλ‹€.
  3. web.xmlμ—μ„œ μ‚¬μš©μžκ°€ μš”μ²­ν•œ URL을 λΆ„μ„ν•˜μ—¬ μ–΄λŠ μ„œλΈ”λ¦Ώμ— λŒ€ν•΄ μš”μ²­ν•œ 것인지 μ°ΎλŠ”λ‹€.
  4. ν•΄λ‹Ή μ„œλΈ”λ¦Ώμ—μ„œ service λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œ ν›„ ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­ μ’…λ₯˜(GET, POST)에 따라 doGet ν˜Ήμ€ doPostλ₯Ό ν˜ΈμΆœν•œλ‹€.
  5. doGet, doPost λ©”μ„œλ“œλŠ” 동적 νŽ˜μ΄μ§€λ₯Ό μƒμ„±ν•œ ν›„, HttpServletResponse 객체에 응닡을 보낸닀.
  6. 응닡이 λλ‚˜λ©΄ HttpServletRequest, HttpServletResponse 객체λ₯Ό μ†Œλ©Έμ‹œν‚¨λ‹€.

Servlet Container

μ„œλΈ”λ¦Ώ μ»¨ν…Œμ΄λ„ˆλŠ” μ„œλΈ”λ¦Ώμ„ μƒμ„±ν•˜κ³  κ΄€λ¦¬ν•œλ‹€. (λŒ€ν‘œμ μœΌλ‘œ 톰캣이 μžˆλ‹€.)

@Override
public void init() throws ServletException {
	super.init();
}

@Override
public void destroy() {
	super.destroy();
}

@Override
protected void service(HttpServletRequest request, HttpServletResponse response) {
	super.service(request, response);
}

μ„œλΈ”λ¦Ώμ€ 생성 μ‹œ init(), 제거 μ‹œ destroy() λ©”μ„œλ“œλ₯Ό 톡해 생성 및 μ œκ±°κ°€ 이루어진닀.
μ„œλΈ”λ¦Ώ μ»¨ν…Œμ΄λ„ˆλŠ” μ„œλΈ”λ¦Ώμ˜ 생성, 호좜, 제거의 λͺ¨λ“  μž‘μ—…λ“€μ„ κ΄€λ¦¬ν•˜λ©΄μ„œ μ„œλΈ”λ¦Ώμ˜ 생λͺ…μ£ΌκΈ°λ₯Ό λ‹΄λ‹Ήν•œλ‹€.

ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­μ΄ 였면, μ„œλΈ”λ¦Ώ μ»¨ν…Œμ΄λ„ˆλŠ” ν•΄λ‹Ή μš”μ²­κ³Ό λ§€ν•‘λœ μ„œλΈ”λ¦Ώμ„ μ°ΎλŠ”λ‹€.
λ§Œμ•½ μ„œλΈ”λ¦Ώμ΄ μƒμ„±λ˜μ–΄ μžˆμ§€ μ•Šλ‹€λ©΄ μ„œλΈ”λ¦Ώ μ»¨ν…Œμ΄λ„ˆλŠ” μ„œλΈ”λ¦Ώμ„ μƒμ„±ν•˜κ³  이λ₯Ό λ™μž‘μ‹œν‚¨λ‹€. μž‘μ—…μ΄ μ’…λ£Œλœ μ„œλΈ”λ¦Ώμ€ μ†Œλ©Έλ˜μ§€ μ•Šκ³ , μ„œλΈ”λ¦Ώ μ»¨ν…Œμ΄λ„ˆμ—μ„œ κ΄€λ¦¬ν•œλ‹€.
ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­κ³Ό λ§€ν•‘λ˜μ–΄ μžˆλŠ” μ„œλΈ”λ¦Ώμ΄ 이미 μ‘΄μž¬ν•œλ‹€λ©΄, μ„œλΈ”λ¦Ώ μ»¨ν…Œμ΄λ„ˆλŠ” ν•΄λ‹Ή μ„œλΈ”λ¦Ώμ„ λ‹€μ‹œ ν˜ΈμΆœν•˜μ—¬ μž‘μ—…μ„ μˆ˜ν–‰ν•œλ‹€. (μ„œλΈ”λ¦Ώ μž¬μ‚¬μš©)


Servlet의 문제점

μ„œλΈ”λ¦Ώμ€ 각 μš”μ²­λ§ˆλ‹€ ν•˜λ‚˜μ˜ μ„œλΈ”λ¦Ώμ΄ 1:1둜 λ§€ν•‘λ˜λŠ” ꡬ쑰λ₯Ό 가지고 μžˆλ‹€. 즉, 10개의 μš”μ²­μ΄ μžˆλ‹€λ©΄ 10개의 μ„œλΈ”λ¦Ώμ΄ μ‘΄μž¬ν•œλ‹€λŠ” μ–˜κΈ°λ‹€. 이 경우 곡톡 둜직이 맀번 λ°˜λ³΅λΌμ„œ μƒμ„±λ˜κ³  μ‹€ν–‰ν•œλ‹€λŠ” 문제점이 생긴닀.
λ˜ν•œ λͺ¨λ“  μš”μ²­λ“€μ΄ μ„œλΈ”λ¦Ώμ— 의쑴적인 ꡬ쑰λ₯Ό 가지기 λ•Œλ¬Έμ—, ν”„λ‘œκ·Έλž¨ λ˜ν•œ μ„œλΈ”λ¦Ώμ— μ˜μ‘΄ν•˜κ²Œ λœλ‹€.

μ΄λŸ¬ν•œ 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ Controllerκ°€ λ“±μž₯ν•œ 것이닀.
Front Controller Patternμ—μ„œ 더 λ‚˜μ•„κ°€ MVC Pattern이 λ“±μž₯ν•˜κ²Œ λ˜μ—ˆλ‹€.


참고 자료

  1. kohen's 기둝, β€œ[Spring] Servletμ΄λž€?”, https://kohen.tistory.com/29

  2. μš°μ•„ν•œTech, β€œ[10λΆ„ ν…Œμ½”ν†‘] λ£¨ν‚€μ˜ Servlet & Spring Web MVC”, https://youtu.be/h0rX720VWCg


μ½”ν…Œ 1문제

λΆ€μ‘±ν•œ κΈˆμ•‘ κ³„μ‚°ν•˜κΈ°

문제 μ„€λͺ…

⬆️ 문제 μ„€λͺ…
⬇️ λ‚΄κ°€ μ§  μ½”λ“œ
class Solution {
    public long solution(int price, int money, int count) {
        long answer = 0;

        for(int i = 1; i <= count; i++) {
            answer += price * i;
        }

        if(money < answer) {
            answer -= money;
            return answer;
        }
        
        return 0;
    }
}

받은 μ μˆ˜λŠ” 10점. 생각보닀 μ—„μ²­ 빨리 ν’€μ—ˆλ‹€.
μ²˜μŒμ—” ν‹€λ Έλ‹€κ³  λ‚˜μ™”λŠ”λ°, μ΄μœ λŠ” κΈˆμ•‘μ΄ λΆ€μ‘±ν•˜μ§€ μ•Šμ„ λ•Œ return 0을 μ•ˆ ν•΄μ€˜μ„œ 그랬던 것... 쑰건을 잘 읽자.

profile
김뉴비

0개의 λŒ“κΈ€

κ΄€λ ¨ μ±„μš© 정보