day36 πŸŒ•

μž₯λ―ΈΒ·2022λ…„ 7μ›” 19일
0

였늘의 μ„±κ³Ό

λͺ©λ‘ 보기
36/129

μŠ€ν”„λ§ MVC 1편 - λ°±μ—”λ“œ μ›Ήκ°œλ°œ ν•΅μ‹¬κΈ°μˆ  μ„Ήμ…˜ 5 μˆ˜κ°•

μ„Ήμ…˜ 5. μŠ€ν”„λ§ MVC - ꡬ쑰 이해 μˆ˜κ°• μ™„λ£Œ!!

κ³Όκ±° 버전 μŠ€ν”„λ§ 컨트둀러

public interface Controller {
	ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception;
}

Controller μΈν„°νŽ˜μ΄μŠ€λŠ” @Controller μ• λ…Έν…Œμ΄μ…˜κ³ΌλŠ” μ „ν˜€ λ‹€λ₯΄λ‹€.

@Controller: μŠ€ν”„λ§μ΄ μžλ™μœΌλ‘œ μŠ€ν”„λ§ 빈으둜 λ“±λ‘ν•œλ‹€. 내뢀에 @Component μ• λ…Έν…Œμ΄μ…˜μ΄ μžˆμ–΄μ„œ μ»΄ν¬λ„ŒνŠΈ μŠ€μΊ”μ˜ λŒ€μƒμ΄ λœλ‹€.
@RequestMapping: μš”μ²­ 정보λ₯Ό λ§€ν•‘ν•œλ‹€. ν•΄λ‹Ή URL이 호좜되면 이 λ©”μ„œλ“œκ°€ ν˜ΈμΆœλœλ‹€.
@ModelAndView: λͺ¨λΈκ³Ό λ·° 정보λ₯Ό λ‹΄μ•„μ„œ λ°˜ν™˜ν•œλ‹€.

@RequestMapping은 URL만 λ§€μΉ­ν•˜λŠ” 것이 μ•„λ‹ˆλΌ HTTP Method도 ν•¨κ»˜ ꡬ뢄할 수 μžˆλ‹€. 이것을 @GetMapping, @PostMapping으둜 더 νŽΈλ¦¬ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλ‹€.


베이슀볼

클둠 뜨고... 브랜치 λ”°κ³ ... 포크 μ°Œλ¦„...

초둱초둱 ν–„κΉ… 이λͺ¨ν‹°μ½˜


μ ˆμ°¨μ§€ν–₯ vs 객체지ν–₯

+) 22. 07. 20. μΆ”κ°€ μ™„λ£Œ!!

μ ˆμ°¨μ§€ν–₯

절차적 ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λŠ” 일련의 처리 절차λ₯Ό 정해진 문법에 따라 μˆœμ„œλŒ€λ‘œ κΈ°μˆ ν•΄λ‚˜κ°€λŠ” 언어이닀.

μž₯점

  • μ»΄ν“¨ν„°μ˜ 처리 ꡬ쑰와 μœ μ‚¬ν•˜μ—¬ μ‹€ν–‰ 속도가 λΉ λ₯΄λ‹€.
  • 같은 μ½”λ“œλ₯Ό λ³΅μ‚¬ν•˜μ§€ μ•Šκ³  λ‹€λ₯Έ μœ„μΉ˜μ—μ„œ ν˜ΈμΆœν•˜μ—¬ μ‚¬μš©ν•  수 μžˆλ‹€.
  • λͺ¨λ“ˆ ꡬ성이 μš©μ΄ν•˜λ©°, ꡬ쑰적인 ν”„λ‘œκ·Έλž˜λ°μ΄ κ°€λŠ₯ν•˜λ‹€.

단점

  • ν”„λ‘œκ·Έλž¨μ„ λΆ„μ„ν•˜κΈ° μ–΄λ ΅λ‹€.
  • μœ μ§€λ³΄μˆ˜λ‚˜ μ½”λ“œμ˜ μˆ˜μ •μ΄ μ–΄λ ΅λ‹€.

μ’…λ₯˜: C, ALGOL, COBOL, FORTRAN λ“±


μ ˆμ°¨μ§€ν–₯ν˜• ν”„λ‘œκ·Έλž¨μ€ 말 κ·ΈλŒ€λ‘œ 이야기λ₯Ό μˆœμ„œλŒ€λ‘œ 써 λ‚˜κ°€λ“―μ΄ ν”„λ‘œκ·Έλž¨μ„ κ΅¬μ„±ν•˜λŠ” 방식이닀. λ¬Όλ‘  β€˜μ ˆμ°¨ 4β€™μ²˜λŸΌ μ œμ–΄λ¬Έμ„ μ‚¬μš©ν•΄ μ‹€ν–‰ μˆœμ„œλ₯Ό λ°”κΏ€ μˆ˜λŠ” μžˆμ§€λ§Œ, 그것쑰차도 μ œμ–΄λ¬Έμ˜ 절차둜 μ§„ν–‰λ˜λŠ” 것이닀.

반면 객체지ν–₯ν˜• ν”„λ‘œκ·Έλž¨μ€ 이 ν”„λ‘œκ·Έλž¨μ—μ„œ μ‚¬μš©λ˜λŠ” 객체(μžλ™μ°¨, 엔진, μš΄μ „μž)λ₯Ό μƒμ„±ν•˜κ³ , 각 객체에 ν¬ν•¨λœ 데이터(컬러, 엔진, 이름, λ©΄ν—ˆλ²ˆν˜Έ, μ’…λ₯˜)와 κΈ°λŠ₯(κ΅¬λ™ν•˜κΈ°, μ „μ§„ν•˜κΈ°, μ •μ§€ν•˜κΈ°, μš΄μ „ν•˜κΈ°, μž₯μ• λ¬Ό κ°μ§€ν•˜κΈ°)을 μƒν˜Έ ν˜ΈμΆœν•¨μœΌλ‘œμ¨ ν”„λ‘œκ·Έλž¨μ„ κ΅¬μ„±ν•˜λŠ” 방식을 λ§ν•œλ‹€.
μ΄λ•Œ 각 객체에 ν¬ν•¨λœ λ°μ΄ν„°λŠ” β€˜μ†μ„±β€™ λ˜λŠ” β€˜ν•„λ“œβ€™λΌ ν•˜κ³ , κΈ°λŠ₯은 β€˜λ©”μ„œλ“œβ€™λΌ ν•œλ‹€.


객체지ν–₯

객체지ν–₯ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λŠ” ν˜„μ‹€ μ„Έκ³„μ˜ 개체(Entity)λ₯Ό κΈ°κ³„μ˜ λΆ€ν’ˆμ²˜λŸΌ ν•˜λ‚˜μ˜ 객체둜 λ§Œλ“€μ–΄, 기계적인 λΆ€ν’ˆλ“€μ„ μ‘°λ¦½ν•˜μ—¬ μ œν’ˆμ„ λ§Œλ“€λ“―μ΄ μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό κ°œλ°œν•  λ•Œλ„ 객체듀을 μ‘°λ¦½ν•΄μ„œ ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•  수 μžˆλ„λ‘ ν•œ ν”„λ‘œκ·Έλž˜λ° 기법이닀.

μž₯점

  • 상속을 ν†΅ν•œ μž¬μ‚¬μš©κ³Ό μ‹œμŠ€ν…œμ˜ ν™•μž₯이 μš©μ΄ν•˜λ‹€.
  • μ½”λ“œμ˜ μž¬ν™œμš©μ„±μ΄ λ†’λ‹€.
  • μ‚¬μš©μžμ™€ 개발자 μ‚¬μ΄μ˜ 이해λ₯Ό μ‰½κ²Œ ν•΄μ€€λ‹€.
  • μ†Œν”„νŠΈμ›¨μ–΄ 개발 및 μœ μ§€λ³΄μˆ˜κ°€ μš©μ΄ν•˜λ‹€.

단점

  • κ΅¬ν˜„ μ‹œ 처리 μ‹œκ°„μ΄ μ§€μ—°λœλ‹€.

μ’…λ₯˜: JAVA, C++, Smalltalk λ“±


μœ„μ˜ μ„€λͺ…은… μ†”μ§νžˆ κ°œλ…λ§Œ λ”°μ˜¨ 거라 λ„ˆλ¬΄ λ”±λ”±ν•˜κ³  잘 λͺ¨λ₯΄κ² λ‹€. μ½”λ“œλ‘œ μ˜ˆμ‹œλ₯Ό 보자.

μš°λ¦¬κ°€ κ²Œμž„μ„ λ§Œλ“ λ‹€κ³  상상해 보자. μ΄λ•Œ ν•„μš”ν•œ 건 β€˜ν”Œλ ˆμ΄μ–΄β€™ 객체닀.
각 ν”Œλ ˆμ΄μ–΄λŠ” 각자 λ‹€λ₯Έ 데이터λ₯Ό κ°€μ§ˆ 것이닀.

const player = {
	name: "rose",
	hp: 100,
	skill: "lucky",
};

λ§Œμ•½ ν”Œλ ˆμ΄μ–΄κ°€ ν•œ λͺ…이라면 μ΄λ ‡κ²Œ μ½”λ“œλ₯Ό μ§œλ„ λ˜μ§€λ§Œ, ν”Œλ ˆμ΄μ–΄κ°€ λŠ˜μ–΄λ‚œλ‹€λ©΄ λ¬Έμ œκ°€ 생길 것이닀.
각 ν”Œλ ˆμ΄μ–΄λ“€μ€ β€˜name’, β€˜hp’, β€˜skillβ€™μ˜ λ™μΌν•œ 속성을 κ°–κ² μ§€λ§Œ 거기에 λ“€μ–΄κ°€λŠ” κ°’(데이터)은 λ‹€ λ‹€λ₯Ό 것이닀.
이 경우 player1, player2, player3… μ΄λ ‡κ²Œ ν”Œλ ˆμ΄μ–΄ 수만큼 객체λ₯Ό μΆ”κ°€ν•˜λŠ” 것은 λ„ˆλ¬΄ λΉ„νš¨μœ¨μ μΌ λΏλ”λŸ¬, μŠ€ν‚¬ 속성을 λΉΌλ¨Ήκ³  μž‘μ„±ν•˜κ±°λ‚˜ 속성에 μ˜€νƒ€κ°€ λ‚  μˆ˜λ„ μžˆλ‹€.
λ˜ν•œ 전체 ν”Œλ ˆμ΄μ–΄μ—κ²Œ κ²½ν—˜μΉ˜ 속성을 μΆ”κ°€ν•˜κ³  싢을 λ•Œλ„, ν”Œλ ˆμ΄μ–΄ 수만큼 ν•˜λ‚˜μ”© λ‹€ μΆ”κ°€ν•΄μ•Ό ν•œλ‹€!

μ΄λŠ” 정말 λΉ„νš¨μœ¨μ μ΄λ‹€.

이런 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄, 객체지ν–₯μ—μ„œλŠ” μΌμ’…μ˜ β€˜ν”Œλ ˆμ΄μ–΄ νŒ©ν† λ¦¬β€™λ₯Ό λ§Œλ“œλŠ” 것이닀. 데이터λ₯Ό λ„£μœΌλ©΄ μ μš©ν•΄μ£ΌλŠ” ν•¨μˆ˜κ°€ 있고, ν”Œλ ˆμ΄μ–΄ 객체λ₯Ό μ•„μ›ƒν’‹μœΌλ‘œ 받을 수 μžˆλŠ” νŒ©ν† λ¦¬ 말이닀.
β†’ ν”Œλ ˆμ΄μ–΄ 객체λ₯Ό λ³΅μ œν•  ν•„μš”λ„ μ—†κ³  슀펠링 였λ₯˜ μœ„ν—˜λ„ 없어진닀. λ˜ν•œ, κ²½ν—˜μΉ˜ 속성을 μΆ”κ°€ν•  λ•Œλ„ ν”Œλ ˆμ΄μ–΄ νŒ©ν† λ¦¬μ— 속성 ν•˜λ‚˜λ§Œ μΆ”κ°€ν•˜λ©΄ λœλ‹€.

즉, 이 ν”Œλ ˆμ΄μ–΄ νŒ©ν† λ¦¬κ°€ 곧 ν΄λž˜μŠ€μ™€ κ°™λ‹€.

Class Player { //μΏ ν‚€ν‹€
	constructor(name, health, skill) {
		this.name = name;
		this.hp = hp;
		this.skill = skill;
		this.xp = 0;
	}
}

const rose = new Player("rose", 100, "lucky"); //μΏ ν‚€
const jangmi = new Player("jangmi", 90, "unlucky");

클래슀 == μΏ ν‚€λ₯Ό μ°μ–΄λ‚΄λŠ” 쿠킀틀이라고 μƒκ°ν•˜λ©΄ 쉽닀.
μΈμŠ€ν„΄μŠ€ ν˜Ήμ€ κ°μ²΄λŠ” 쿠킀틀을 μ‚¬μš©ν•œ ν›„ 얻을 수 μžˆλŠ” 쿠킀에 μ†ν•œλ‹€.

μœ„μ˜ μ½”λ“œμ—μ„œ thisλΌλŠ” λ‹¨μ–΄λŠ” ν”Œλ ˆμ΄μ–΄ 클래슀 λ‚΄μ˜ 속성 및 λ©”μ„œλ“œλ₯Ό μ§€μΉ­ν•˜λŠ” 방법이닀.

μ΄μ „μ—λŠ” 클래슀둜 데이터λ₯Ό μ •λ¦¬ν•˜κΈ°λ§Œ ν–ˆλ‹€. ν•˜μ§€λ§Œ, λ©”μ„œλ“œ(μœ„ μ½”λ“œμ—μ„œλŠ” constructor) 덕뢄에 데이터에 μ•‘μ„ΈμŠ€ν•˜κ³  μ‘°μž‘ν•  수 μžˆλŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ§Œλ“€ 수 있게 됐닀.

상속은 μ½”λ“œμ˜ 쀑볡을 쀄이고 μ½”λ“œλ₯Ό μž¬μ‚¬μš© κ°€λŠ₯ν•˜κ²Œ λ‚˜λˆŒ 수 있게 ν•΄ μ€€λ‹€.
상속은 μžλ…€ ν΄λž˜μŠ€κ°€ λΆ€λͺ¨ 클래슀의 속성을 가진단 λœ»μ΄λ‹€. μ•„λž˜ μ½”λ“œλ₯Ό 보자.

class Human {
	constructor(name) {
		this.name = name;
		this.arms = 2;
		this.legs = 2;
	}
}
class Baby extends Human {
	constructor(name) {
		this.cute = ture;
	}
	cry() {
		return 'waa waa';
	}
}
class Teenager extends Human {
	constructor(name) {
		this.emotional = true;
	}
	curse() {
		return '#$18%@&!';
	}
}

β€˜μ•„κΈ°β€™ ν΄λž˜μŠ€λ‚˜ β€˜μ²­μ†Œλ…„β€™ ν΄λž˜μŠ€κ°€ β€˜μΈκ°„β€™μ—μ„œ ν™•μž₯(extends)λœλ‹€κ³  ν•˜λ©΄, 아기와 μ²­μ†Œλ…„ ν΄λž˜μŠ€κ°€ 인간 클래슀의 속성을 λ‹€ κ°–μΆ”κ³  μΆ”κ°€μ μœΌλ‘œ κ·Έλ“€λ§Œμ˜ λ‹€λ₯Έ 속성을 가진단 λœ»μ΄λ‹€.

즉, μ•„κΈ° μΈμŠ€ν„΄μŠ€λŠ” 이름, 두 νŒ”, 두 닀리λ₯Ό κ°–κ³  κ±°κΈ°λ‹€ μΆ”κ°€λ‘œ κ·€μ—½κ³ , μš΄λ‹€λŠ” 속성을 κ°€μ§ˆ 것이닀.

μ•„κΈ°, μ²­μ†Œλ…„ ν΄λž˜μŠ€μ—μ„œ μΈκ°„μ˜ constructor λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λ €λ©΄ 각 클래슀 λ‚΄μ˜ constructorμ—μ„œ super(name);을 ν˜ΈμΆœν•΄μ•Ό ν•œλ‹€. (superλŠ” λΆ€λͺ¨λΌκ³  μƒκ°ν•˜λ©΄ λœλ‹€.)


객체지ν–₯의 4가지 핡심 κ°œλ…

  1. μΊ‘μŠν™”(Encapsulation)
    데이터와 ν•¨μˆ˜λ₯Ό 캑슐 ν˜Ήμ€ μ»¨ν…Œμ΄λ„ˆ μ•ˆμ— λ‘λŠ” 것. 이 경우 μΊ‘μŠμ€ classλ₯Ό μ˜λ―Έν•œλ‹€.
    β†’ μ½”λ“œκ°€ μ’€ 더 κ΅¬μ‘°ν™”λ˜κ³ , ν•¨μˆ˜λ‚˜ λ©”μ„œλ“œκ°€ 인수λ₯Ό μ·¨ν•  ν•„μš” 없이 this ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ 데이터에 μ•‘μ„ΈμŠ€ ν•  수 μžˆλ‹€.
    μΊ‘μŠν™”λ₯Ό μ‚¬μš©ν•˜μ—¬ ν‘œμ‹œν•  클래슀의 속성과 숨길 속성을 선택할 수 μžˆλ‹€.

  2. 상속(Inheritance)
    클래슀λ₯Ό ν™•μž₯(extends)ν•˜λ©΄ μžμ‹ ν΄λž˜μŠ€λŠ” λΆ€λͺ¨ 클래슀의 λͺ¨λ“  속성과 λ©”μ„œλ“œλ₯Ό μƒμ†ν•˜κ²Œ λœλ‹€.
    μš°λ¦¬λŠ” 상속 덕뢄에 μ½”λ“œλ₯Ό 더 μž‘μ€ λ‹¨μœ„λ‘œ μͺΌκ°œκ³  μž¬μ‚¬μš© ν•  수 μžˆλ‹€.
    λ§Œμ•½ 상속이 μ—†λ‹€λ©΄ μ€‘λ³΅λœ 속성을 가진 두 개의 λ³„λ„μ˜ 클래슀λ₯Ό λ§Œλ“€μ–΄μ•Ό ν•  것이닀.

  3. 좔상화(Abstraction)
    μ‹€μƒν™œλ‘œ 예λ₯Ό λ“€μ–΄λ³΄μž.
    μš°λ¦¬κ°€ μ°¨λŸ‰μ„ μš΄μ „ν•  λ•Œ, 이λ₯Ό μœ„ν•œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•œλ‹€. μΈν„°νŽ˜μ΄μŠ€, 즉, 휠, νŽ˜λ‹¬, 각쒅 λ²„νŠΌ 등은 μ°¨λŸ‰ μ œμ‘°μ‚¬μ— μ˜ν•΄ λ…ΈμΆœμ΄ λ˜μ–΄μžˆλ‹€.
    μš°λ¦¬λŠ” 이 μΈν„°νŽ˜μ΄μŠ€λ§Œ ν™œμš©ν•΄μ„œ μ°¨λŸ‰μ„ μš΄μ „ν•  수 μžˆλ‹€. μ°¨λŸ‰μ˜ μ„ΈλΆ€ κ΅¬ν˜„ μ •λ³΄λŠ” λ…ΈμΆœλ˜μ–΄ μžˆμ§€ μ•Šλ‹€. λ”°λΌμ„œ μš΄μ „μžλŠ” λΈŒλ ˆμ΄ν¬λ‚˜ 엔진이 μ–΄λ–»κ²Œ μž‘λ™ν•˜λŠ”μ§€ μ„ΈλΆ€ 사항을 μ•Œμ§€ λͺ»ν•˜λ”라도 μ°¨λ₯Ό μš΄μ „ν•  수 μžˆλ‹€.
    β†’ λ©”μ„œλ“œμ˜ λ‚΄λΆ€ μž‘μ—…μ„ 바꿔도, κ·Έ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” μ‚¬λžŒμ€ λ­”κ°€λ₯Ό λ°”κΏ€ ν•„μš”κ°€ μ—†λ‹€. μ™œλƒν•˜λ©΄ κ΅¬ν˜„ μ„ΈλΆ€ λ‚΄μš©μ΄ λ°”λ€Œμ—ˆλ”λΌλ„ μΈν„°νŽ˜μ΄μŠ€λŠ” κ·ΈλŒ€λ‘œ μœ μ§€λ˜μ—ˆκΈ° λ•Œλ¬Έμ΄λ‹€.

  4. λ‹€ν˜•μ„±(Polymorphism)

    class Person {
    	public sayHi() {
    		return "Hi";
    	}
    }
    
    class ν•œκ΅­μΈ extends Person {}
    class 미ꡭ인 extends Person {}

    μœ„ μ½”λ“œμ—μ„œ ν•œκ΅­μΈ, 미ꡭ인 ν΄λž˜μŠ€λŠ” λ‘˜ λ‹€ Person ν΄λž˜μŠ€μ—μ„œ ν™•μž₯λœλ‹€. 두 클래슀 λͺ¨λ‘ sayHi λ©”μ„œλ“œλ₯Ό κ°–λŠ”λ‹€.
    ν•œκ΅­μΈ ν΄λž˜μŠ€κ°€ Person ν΄λž˜μŠ€μ—μ„œ ν™•μž₯λ˜μ§€λ§Œ, sayHi 방법은 λ‹€λ₯΄κ²Œ ν•˜κΈΈ 원할 λ•Œ λ‹€ν˜•μ„±μ΄ μ‚¬μš©λœλ‹€.

    class ν•œκ΅­μΈ extends Person {
    	public sayHi() {
    		return "μ•ˆλ…•";
    	}
    }

    μœ„μ™€ 같은 μ½”λ“œλ₯Ό λ©”μ„œλ“œ μ˜€λ²„λΌμ΄λ”©μ΄λΌ ν•œλ‹€. λ©”μ„œλ“œμ˜ 이름은 κ°™μ§€λ§Œ κ΅¬ν˜„ 방식은 λ‹€λ₯Έ 것이닀.
    이λ₯Ό λ‹€ν˜•μ„±μ΄λΌκ³  ν•œλ‹€.


참고 자료

  1. λ…Έλ§ˆλ“œ 코더, β€œκ°μ²΄μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°β€, https://youtu.be/cg1xvFy1JQQ

  2. λ…Έλ§ˆλ“œ 코더, β€œκ°μ²΄μ§€ν–₯ κ°œλ…μ •λ¦¬β€, https://youtu.be/IeLWSKq0xIQ

  3. κΉ€λ™ν˜•, Do it! μžλ°” μ™„μ „ 정볡

profile
김뉴비

0개의 λŒ“κΈ€

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