스프링 기초 복습 ( feat 빈 설정방법)
[Spring] 스프링 XML 설정 파일 작성 방법 정리
[Spring] 스프링 XML 설정 파일 작성 방법 정리 📄 목차 1. 스프링 XML 설정 파일 포맷 - 기본 포맷 - 애노테이션 설정을 사용하기 위한 포맷 2. 빈(Bean) 설정 예시 - 자동 주입 설정 - autowire 속성 3.
atoz-develop.tistory.com
읽어보기
1. DI가 무엇인가?
Dependency Injection 의존성 주입
객체간의 의존관계를 객체자신이 정의해서 생성하는게 아니라 외부에서 주입해서 수행해준다
왜? 요청을 받을 때마다 매번 객체를 생성하고 처리할수 없어서
DI 패턴에는 2가지 방식이 있는데 xml에서 1) 생성자 방식 (Constructor-arg) 2) 메서드 방식 (property)
1) 생성자 방식
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- memberDao는 왜 bean에 넣냐하면 밑에 RegisterService클래스에서 파라미터로 멤버다오를 넣기 때문에! 그 멤버다오는 생성자로 넣어야 하기 때문에 -->
<!-- 그럼 RegisterService는 왜 다오가 필요한데? 새로 입력받아서 멤버데이터 = 멤버+a 데이터가 되었다고 셋팅해야하기 때문에 -->
<bean id = "memberDao" class = "ch02_obj.MemberDao" />
<!-- constructor 인젝션 방식 -->
<bean id = "memberRegSvc" class = "ch02_obj.MemberRegisterService">
<constructor-arg ref = "memberDao" /><!-- MemberRegisterService 클래스에 memberDao가 있어야함 -->
</bean>
</beans>
2) 메서드 방식
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- ch02_obj밑에 Greeter클래스 -->
<bean id = "greeter" class = "ch02_obj.Greeter">
<!-- setter injection 방식 : 클래스에서 setFormat(String msg)을 찾아가서
여기 value(value타입은 항상 String이다)를 String msg에 넣는다 -->
<property name ="format" value = "안녕하세요 스프링 첫날입니다">
</property>
</bean>
</beans>
2. AOP가 무엇인가?
Aspect Oriented Programming 관점지향 프로그래밍
코드를 분리하는 것
비즈니스적인 로직 외의 기본적인 횡단 관심사를 분리하는 것
횡단 관심사? 대표적인 예시가 로그인
로그인을 해야지만 홈페이지의 주요 서비스 이용가능
왜 분리? 중복을 제거하고 유지보수를 용이하게 하기 위해서
3. 스프링 하는데 메서드에 public private가 갑자기 헷갈린다 ㅠ
여기선 왜 public이었다가 갑자기 또 private을 왜 쓰는거지?
public이 뭐고 private이 뭔지 알았는데 갑자기 또 헷갈린다
이걸 꼭 알아야겠다 수업 끝나고 씻고 다시 온다!
< public & private & protected >
public : 어디에서든지 접근가능
private : 같은 패키지에서만 접근 가능
protected : 같은 패키지나 자식 클래스에서만 접근가능
public class : 모든 package에서 해당 class로 접근가능
private class : 자신을 포함한 같은 package에서만 해당 class로 접근 가능
protected class : 상속받은 class 에서만 해당 class로 접근가능
public method : 모든 class에서 해당 method로 접근가능
private method : 자신이 포함된 class에서만 해당 method로 접근가능
protected class : 상속 받은 class와 자신이 속한 class에서만 접근가능
package ch02;
import java.util.Scanner;
import org.springframework.context.support.GenericXmlApplicationContext;
import ch02_obj.MemberRegisterService;
import ch02_obj.RegisterRequest;
public class Main2_xml {
static GenericXmlApplicationContext factory;
public static void main(String[] args) {
// TODO Auto-generated method stub
factory //classpath:는 src밑이라는 의미
= new GenericXmlApplicationContext("classpath:ch02_DIXML/Container2.xml");
System.out.println("ok"); //확인 먼저 하고
Scanner scan = new Scanner(System.in);
while(true) {
System.out.println("명령어를 입력하세요");
String command = scan.nextLine(); //console의 다음줄에서 값을 받겠다
if(command.equalsIgnoreCase("exit")) {
System.out.println("종료합니다");
break;
} else if(command.startsWith("new ")) { //new가 오면 새 메서드 실행할거야 new email name psw1 psw2
processNewCommand(command.split(" "));
continue;
}
}
} // end main
private static void processNewCommand(String[] arg) {
System.out.println(arg.length); // 입력받은 값 배열의 크기 확인하기
if (arg.length != 5) {
printHelp(); // 넣을려는 값이 5가 아니면 에러메세지 처리
return;
}
MemberRegisterService regSvc = factory.getBean("memberRegSvc", MemberRegisterService.class);
RegisterRequest req = new RegisterRequest();
req.setEmail(arg[1]); //배열의 첫번째 값은 이메일이니까
req.setName(arg[2]);
req.setPassword(arg[3]);
req.setConfirmPassword(arg[4]);
System.out.println(req);
//regSvc.resit()
System.out.println("회원가입입니다");
}
public static void printHelp() {
System.out.println("잘못된 명령입니다. 아래 명령어 사용법을 확인하세요");
System.out.println("new 이메일 이름 암호 암호확인");
}
} // end class
processNewCommand에서 private 쓴거는 이해가는데
왜 printHelp에서는 public을 썼을까....?
private쓰면 안되나?
이 printHelp 메서드를 또 다른 데에서 쓸 생각이기때문에 public을 사용한거 같은데
이거는 수업이 더 진행되어봐야 알거 같아서 좀 기다렸다가 나중에 강사님께 질문해야할거 같다
< static & final & static final >
이거도 갑자기 궁금해져서....
static : 고정된 .
객체 생성 없이 사용할 수 있는 필드와 메서드를 생성하고자 사용
객체마다 다른 값을 가져야 한다면 인스턴스로 생성해야하지만
공용데이터의 경우 static 사용해서 가져다 쓰기
final : 최종의 .
값이 정해지면 수정 불가
ex ) 학교 등교시간 -- 한 학교당 등교시간은 정해져있지만 학교별로 등교시간이 다를 수 있음
--한 객체에서는 고정값이지만 객체별로는 다를수 있다!
static final : 고정이면서 최종.
객체마다 값이 저장될 필요 없고 + 여러 값을 가질 수 없다
객체 생성없이 그냥 가져다 쓰면 되는 것
ex ) PI값....수학원리....
이제 노마드 코더 강의 들어보러 가야지!