본문 바로가기
공부/JAVA

2022.01.25 - spring 시작!

by 기묜몬 2022. 1. 25.

여태까지 정신없이 배웠던 자바의 노가다 기능 및 코드들이

스프링을 이용하니 코드도 짧아지고,, 과정도 짧아지는 듯 하다 ?

신기함..

그래서 스프링을 꼭 배워야한다는 건가!?

정신없이 따라가고 있고, 아직도 어려운게 한가득이지만 

뭐 재밌다. .. ..!!

 

 

[ spring 프레임워크 ]

- 스프링은 여러개의 모듈로 구성되어있고, 각 모듈은 하나 이상의 jar 파일로 구성되어있다. 

이 몇개의 jar 파일로 개발과 실행이 모두 가능하다.

즉, 스프링을 이용해서 만들 애플리캐이션의 배포 또한 빠르고 쉽게 진행할 수 있다. 

 

- 객체 생성을 자바코드로 직접 처리하는것이 아니라, 컨테이너가 대신 처리하고 

  객체와 객체사이의 의존관계도 컨테이너가 처리한다. 

 

- 스프링 프레임워크에는 자신이 관리할 클래스들이 등록된 xml 설정 파일이 필요하다. 

 

- 스프링 컨테이너 종류 

  1) BeanFactory : 스프링 설정파일에 등록된 <bean> 객체를 생성하고 관리하는 기본적인 컨테이너 기능만 제공 

      클라이언트의 요청에 의해서만 <bean>객체가 생성되는 지연로딩 방식 

  2) ApplicationContext : BeanFactory가 제공하는 <bean>객체관리 기능 

      컨테이너가 구동되는 시점에 <bean>에 등록된 클래스들을 객체가 생성되는 즉시 로딩 방식 

 

- pplicationContext의 대표적인 클래스 

  1) GenericXmlApplicationContext 

      : 파일 시스템이나 클래스 경로에 있는 XML 설정 파일을 로딩하여 구동하는 컨테이너 

  2)  XmlWebApplicationContext 

      : 웹 기반의 스프링 애플리케이션을 개발할때 사용하는 컨테이너 

 

* 스프링 컨테이너는 xml파일에 등록된 클래스를 찾아서 객체를 생성할 경우 

기본적으로 매개변수가 없는 기본 생성자를 호출하기때문에 

컨테이너가 기본생성자 말고, 매개변수를 가지는 다른 생성자를 호출할 수 있도록 생성자 인젝션을 사용한다. 

-> Constructor-arg (생성자) 의존객체주입 

 1) 클래스에 매개변수를 가지는 생성자를 만든다.

public class AirPlane {

 

private String kind;

private String company;

public AirPlane() {

super();

 

 2) applicationContext.xml 파일에서 <bean> 설정을 해준다. 

<bean id="ap" class="a01_diexp.vo.AirPlane">

<constructor-arg value="K104"/>

<constructor-arg value="대한항공"/>

</bean>

 

  ->Constructor-arg (생성자)의존객체주입 

name 속성값이 호출하고자하는 메소드 이름이 된다.. 

<property name="호출하고자 하는 메소드 이름" ref="빈객체이름"></property>

**Constructor-arg (생성자) vs Constructor-arg (생성자) 이 둘의 차이점이나 사용법이 아직 익숙치않아서

강사님께 피드백 요청.. 

 

 

 

[ 1월 25일 과제 ]

1. property 의존성 객체 주입 예시로 설명 

property 는 일반적으로 DTO 또는 VO 에서 볼 수 있다. 

인스턴스 변수와 getter setter로 만들어진 형태이다. 

 1) vo객체 담을 class 생성 

public class Fruit {

 

private String name;

private int price;

private String prodLoc; //생산지

public Fruit() {

 

 2) xml 파일에 bean을 생성하는 코드를 추가하고 property 코드 작성 

<bean id="f01" class="a01_diexp.vo.Fruit">

<property name="name" value="사과"></property>

<property name="price" value="2000"></property>

<property name="prodLoc" value="대구"></property>

</bean>

  

 3) main메서드에 ApplicationContext 빈 객체를 만들고

tring path = "a01_diexp/di01.xml";

GenericXmlApplicationContext ctx = new GenericXmlApplicationContext(path);

    xml 파일로부터 정보를 읽어와 객체를 생성하고 초기화 시킨다. 

    

    ->GenericXmlApplicationContext 클래스는 작성된 스프링 설정 파일을 읽어와 로딩 시키고, 

    객체를 생성하며, 초기화하는 역할을 한다.

    또한 getBean 메소드를 이용하여 스프링 컨테이너에 생성된 객체에 접근 가능할 수 있게 된다. 

 

 4) 생성한 class 의 bean을 가져온 후

Fruit f01 = ctx.getBean("f01", Fruit.class);

 

 5) 객체를 닫는다 

ctx.close();

 

 

2. 회원등록하는 요청(회원아이디, 패스워드, 회원명, 권한, 포인트)를 처리하는 spring controller의 기능메서드를 선언하고, 

  요청값을 처리하여, console창에 출력되게 하세요.

  

  1) vo객체 Member 클래스 생성 

    public class Member {

private String id;

private String pw;

private String name;

private String auth;

private int point;

public Member() {

super();

...

     ( 기능메서드 선언 ) -? 이부분 뭔가 이상함.. 내일 피드백 요청함..

      public void showM() {

System.out.println("회원 아이디 :"+id);

System.out.println("회원 비번 :"+pw);

System.out.println("회원 이름 :"+name);

System.out.println("회원 권한 :"+auth);

System.out.println("회원 포인트 :"+point);

}

 

   2) DI03.xml bean으로 생성자에 순서대로 인자 전달 

    

    <bean id="mem" class="a01_diexp.vo.Member">

<constructor-arg value="hihi"/>

<constructor-arg value="7777"/>

<constructor-arg value="홍길동"/>

<constructor-arg value="일반사용자"/>

<constructor-arg value="3500"/>

</bean>

 

    3) DIExp_03.exp 기능메서드 호출 

    Member mem = ctx.getBean("mem", Member.class);

mem.showM();

 

4) console. 출력 

회원 아이디 :hihi

회원 비번 :7777

회원 이름 :홍길동

회원 권한 :일반사용자

회원 포인트 :3500

 

3. 스프링 컨테이너 환경을 설정하는 방법을 기술하라. 

  - src/main/java에는 일반적인 자바 소스를 등록한다. 

  - src/main/resources 에는 자바소스가 아닌 xml이나 프로퍼티 파일을 등록한다. 

 

6. class에서 객체 vs 객체의 1:1 관계를 설정하기위한 처리 방법 

  - 연관관계는 a클래스가 b클래스을 알고 그 참조를 보유한다는 것을 나타낸다.

  - 객체를 멤버객체(필드)로 사용한다. 

 

7. 객체 vs 객체 연습 

(1) Academy클래스 

package a01_diexp.vo;

 

public class Academy {

private String name; //학원이름

private String team; //몇조인지?

public Academy() {

super();

// TODO Auto-generated constructor stub

}

public Academy(String name, String team) {

super();

this.name = name;

this.team = team;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getTeam() {

return team;

}

public void setTeam(String team) {

this.team = team;

}

 

}

 

(2) Student 클래스 생성(Academy 객체 사용)

public class Student {

private String sname;

private Academy academy;

public Student() {

super();

// TODO Auto-generated constructor stub

}

public Student(String sname) {

super();

this.sname = sname;

}

public void info() {

System.out.println("수강생 이름 : "+sname);

if(academy!=null) {

System.out.println("학원 이름 : "+academy.getName());

System.out.println("조 이름 : "+academy.getTeam());

}else {

System.out.println("해당정보가 없습니다. ");

}

}

public String getSname() {

return sname;

}

public void setSname(String sname) {

this.sname = sname;

}

public Academy getAcademy() {

return academy;

}

public void setAcademy(Academy academy) {

this.academy = academy;

}

 

 

}

(3) DI03.xml

  <bean id="ssang" class="a01_diexp.vo.Academy">

<constructor-arg value="국비"/>

<constructor-arg value="n조"/>

</bean>

<bean id="student" class="a01_diexp.vo.Student">

<constructor-arg value="홍길동"/>

<property name="Academy" ref="ssang"/>

</bean> 

 

(4) DIExp.03

Student student = ctx.getBean("student", Student.class);

student.info();

 

 

ctx.close();

}

 

 

수강생 이름 : 홍길동

학원 이름 : 국비

조 이름 : n조