TIL10 [생활코딩] [스프링입문]

givemacdonalds·2023년 12월 7일
0

TIL

목록 보기
11/16

[생활코딩]

디자인 패턴

프로그래밍을 어떻게 만드는가?(설계부분)

디자인 패턴 왜 필요할까?

  1. 작업하는 사람간의 의사소통 원활
  2. 잘 설계된 패턴을 익혀가면서 학습 할 수 있음(프로그래밍 스킬업)

이전에 사용했던 Calculator 예제는 Template pattern

final

추상: 상속을 강제 <-> final: 상속/변경 금지하는 규제

예제

class Calculator{
	static final double PI=3.14;
    int left,right;
    
    public void setOprands(int left,int right){
    	this.left=left;
        this.right=right;
        //Calculator.PI=6;
    }
    
    public void sum(){
    	System.out.println(this.left+this.right);
    }
    public void avg(){
    	System.out.println((this.left+this.right)/2);
    }
}
public class CalculatorDemo1{
	public 
}

static final doubl PI=3.14; : PI는 변하지 않는 값이여서 final을 지정함
주석처리된 부분을 실행해보면 error 발생함.(final을 지정했기 때문에)

final 메소드

class A{
	final void b(){}
}
class B extends A{
	void b(){}
}

A class의 b메소드는 final로 지정되어있기 때문에 overriding 불가해서 error가 발생함

final 클래스

final class C{
	final void b(){}
}
clss D extends c{}

final로 class C를 지정했기 때문에 상속 불가함

인터페이스

abstract final 과 같은 대표적인 규제인 interface

어떤 객체가 있고 그 객체가 특정한 인터페이스를 사용한다면 반드시 인터페이스의 메소드들을 구현해야함

예제

interface I{
	public void z();
}

class A implements I{
	public void z(){}
}

class Ainterface I를 구현함

클래스 A는 인터페이스 I를 구현한다라고 함

실질적인 쓰임

class CalculatorDummy{
	public void setOprands(int first, int second,int third){}
    public int sum(){
    	return 60;
    }
    public int avg(){
    	return 20;
    }
}

public class CalculatorConsumer{
	public static void main(String[] args){
    	CalculatorDummy c = new CalculatorDummy();
        c.setOprands(10,20,30);
        System.out.println(c.sum()+c.avg);
    }
}

여기서 클래스 CalculatorDummy 는 가짜 클래스임
사용자는 계산기라는 클래스가 필요하지만 계산기 클래스가 완성되려면 3개월의 시간이 필요함
사용하는 입장에서는 계산기 클래스가 완성될거라고 기대하고 모조 클래스를 생성하고 나머지 로직을 완성하게 됨

3개월 뒤 코드를 받아보니 문제가 발생
기대했던 매개변수의 갯수와 실제 메소드의 매개변수 갯수가 달라지게 됨

class Calculator{
	int left,right;
    public void setOprands(int left,int right){
    	this.left=left;
        this.right=right;
    }
    public void sum(){
    	System.out.println(this.left+this.right);
    }
    public void avg(){
    	System.out.println((this.left+this.right)/2);
    }
}

(잘못된 커뮤니케이션으로 error가 발생)

인터페이스 도입

계산기를 사용하는 개발자A
계산기를 개발하는 개발자B
아래의 형식으로 인터페이스를 구성하게 됨

public interface Calculatorble{
	public void setOprands(int first,int second,int third);
    public int sum();
    public int avg();
}

개발자 A

class CalculatorDummy implements Calculatable{
	public void setOprands(int first,int second,int third){
    }
    public int sum(){
    	return 60;
    }
    public int avg(){
    	return 20;
    }
}
public class CalculatorConsumer{
	public static void main(String[] args){
    	CalculatorDummy c = new CalculatorDummy();
        c.setOprands(10,20,30);
        System.out.println(c.sum()+c.avg());
    }
}

해당 인터페이스를 생성하고 나머지 기능을 개발하게됨

개발자 B

class Calculator implements Calculatable{
	int first,second,third;
    public void setOprands(int first,int second,int third){
    	this.first=first;
        this.second=second;
        this.third=third;
    }
    public int sum(){
    	return this.first+this.second+this.third;
	}
    public int avg(){
    	return (this.first+this.second+this.third)/2;
    }
}

인터페이스 구성대로 개발자는 계산기를 개발하면 됨

계산시 개발을 완성한 이후 인계를 받은 개발자A 는 CalculatorDummy c = new Calculator() 로 실행해주면 정상적으로 실행됨

인터페이스는 명세서라고 생각하면 될 것 같다


[스프링입문]

회원 서비스

멤버 서비스에서 사용하는 MemoryMemberRepository
테스트 케이스에서 사용하는 MemoryMemberRepository
서로 다른 리포지토리(인스턴스)이기 때문에 다른 내용물이 될 수 있는 우려가 있음

그래서 외부에서 객체를 받아서 넣어줌

스프링 빈과 의존관계

지금까지
멤버 서비스
리포지토리
멤버 객체
서비스를 통해 멤버를 가입 할 수 있고 리포지토리에 저장됨
리포지토리에서 꺼내올 수 있고
테스트케이스

이제 화면에 붙이고 싶음 --> 컨트롤러랑 뷰템플릿이 필요함

DI 의존관계를 넣어줌

0개의 댓글