유디의 공간정보·개발일기

1. 0901_Maven과 근본적인 이해를 위한 노가다 코딩 본문

Spring, Mybatis

1. 0901_Maven과 근본적인 이해를 위한 노가다 코딩

55yudi 2021. 9. 1. 18:22

Spring
- 스프링
- 스프링 MVC
- 마이바티스

 

* eclipse에서 UTF-8로 텍스트 인코딩 설정
window-preferences-general-workspace
(실무 면접 시 IDE를 뭘 썼나 : 이클립스,
 이클립스를 처음 실행 시 어떤 것을 해야할까 : 인코딩~~)

 

- 1521 --> 오라클이 사용하는 포트 번호 (8080 port를 쓰고 있어서)

톰캣을 9000으로

 

1. 스프링 없이 날코딩으로 먼저 해보기(근본적인 도움이 될 것,, ㄱ고생,,)

myspring

- 클래스 내부 구성요소 : 변수, 함수, 생성자

- 클래스 : 변수, 함수, 생성자를 포함하는 것

 

- 함수에 throws로 정의했기 때문에 main에서 함수호출할 때도 throws로 예외처리 해줘야 한다.

<EmpMain.java>

package myspring;

import java.util.List;
import java.util.Scanner;

public class EmpMain {
	//함수에 throws로 정의했기 때문에 main에서 함수호출할 때도 throws로 예외처리 해줘야 한다.
	public static void main(String[] args) throws Exception {
		// 사용자로부터 부서번호를 입력받아서 그 부서에 근무하는 사원들의 정보를 출력함
		Scanner scan = new Scanner(System.in);
		System.out.print("부서번호 : ");
		int deptId = scan.nextInt();
		EmpDAO dao = new EmpDAO();
		// 부서번호를 전달받아서 부서원의 정보목록을 리턴한다.
		// 메서드명, 매개변수, 리턴타입 --> getEmpList, int deptId, list>부서원의 정보>EmpVO
		List<EmpVO> list = dao.getEmpListByDeptId(deptId);
		//                 변수. EmpDAO안에 있는 함수 (-> 타입은 EmpDAO)
		for(EmpVO vo : list) {
			System.out.println(vo);
		}
	}

}

<EmpDAO.java>

package myspring;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

public class EmpDAO {

	public List<EmpVO> getEmpListByDeptId(int deptId) throws Exception {
		List<EmpVO> result = new ArrayList<EmpVO>();
		Class.forName("oracle.jdbc.driver.OracleDriver");
		Connection con = DriverManager.getConnection(
				"jdbc:oracle:thin:@localhost:1521:xe","hr","hr");
							
		System.out.println(con.getClass().getName());
		String sql = "select * from employees where department_id = ?";
		PreparedStatement stmt = con.prepareStatement(sql);
		stmt.setInt(1, deptId);
		ResultSet rs = stmt.executeQuery();
		while(rs.next()) {
			EmpVO vo = new EmpVO();
			vo.employeeId = rs.getInt("employee_id");
			//                        DB 테이블의 컬럼명
			vo.lastName = rs.getString("last_name");
			result.add(vo);
		}
		return result;
	}

}

<EmpVO.java>

- override하기

- Source - Generate toString()

package myspring;

public class EmpVO { //부서원의 정보목록(Value Object)
	public int employeeId;
	public String lastName;
	
	@Override
	public String toString() {
		return "EmpVO [employeeId=" + employeeId + ", lastName=" + lastName + "]";
	}

}

<EmpMainSpring.java>

package myspring;

import java.util.List;
import java.util.Scanner;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class EmpMainSpring {
	
	public static void main(String[] args) throws Exception {
		// 사용자로부터 부서번호를 입력받아서 그 부서에 근무하는 사원들의 정보를 출력함
//		Scanner scan = new Scanner(System.in);
//		System.out.print("부서번호 : ");
//		int deptId = scan.nextInt();
		
		ClassPathXmlApplicationContext context =
				new ClassPathXmlApplicationContext("classpath:context-spring.xml");
		int deptId = 100;
//		EmpDAO dao = new EmpDAO();
		EmpDAO dao = (EmpDAO) context.getBean("EmpDAO");
		// 부서번호를 전달받아서 부서원의 정보목록을 리턴한다.
		// 메서드명, 매개변수, 리턴타입 --> getEmpList, int deptId, list>부서원의 정보>EmpVO
		List<EmpVO> list = dao.getEmpListByDeptId(deptId);
		//                 변수. EmpDAO안에 있는 함수 (-> 타입은 EmpDAO)
		for(EmpVO vo : list) {
			System.out.println(vo);
		}
	}

}

 

 


- 스프링의 주요 특징

  * POJO기반의 구성

  * 의존성 주입을 통한 객체 간의 관계 구성

  * AOP 지원

  * WAS 에 종속적이지 않은 개발 환경

    (WAS : 웹 어플리케이션 서버 ==> 지금은 아파치톰캣을 사용해 봄, 실무에서는 다양한 WAS가 있다.)

 

 

- Enterprise Java Beans 샘플코드

https://docs.oracle.com/cd/E13222_01/wls/docs100/ejb30/examples.html

 

Simple Enterprise JavaBeans 3.0 Examples

The following sections describe simple Java examples of EJBs that use the new metadata annotation programming model: Later procedural sections of this guide that describe how to program an EJB make reference to these examples. The following code shows a si

docs.oracle.com

 

@ : annotation

 

new - other - Spring Bean Configuration File 생성 - context-spring 이름 지정
jar파일들을 다운받고 lib에 넣기 --> Build Path jar파일마다 Add JARs로 추가
xml파일에 <bean>코드 추가

<EmpMainSpring.java> 내용 바뀜

package myspring;

import java.util.List;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class EmpMainSpring {
	//위 클래스가 의존하는 클래스는? --> EmpServiceImpl, EmpDAO를 의존하고 있다.
      public static void main(String[] args) throws Exception {
               
         //EmpDAO dao = (EmpDAO)context.getBean("emp"); //context- .xml에 id로 되있는것
         //부서번호를 전달받아서 부서원의 정보목록을 리턴한다
         //메서드명,매개변수,리턴타입  getEmpList , int deptId
         
         int deptId = 100;
         EmpServiceImpl emp = new EmpServiceImpl();
         
         EmpDAO dao = new EmpDAO();
         emp.setDao(dao);
         List<EmpVO> list = emp.getList(deptId);
         for(EmpVO vo : list) {
            System.out.println(vo);
      
      }
}
}

 

(근데 계속 자잘한 에러창이 떠서 입력이나 커서이동시 불편하게 막는다.. 구글링해도 못찾겠다..)

An internal error occurred during: "Compute launch button tooltip". Truncated class file <-- 에러,,

An internal error occurred during: "Initializing Java Tooling".
Truncated class file <-- 이번에는 이 에러,,ㅎ...

인터페이스나 클래스 생성도 안된다,,ㅎㅠㅠ

--> 2020-12 버전으로 eclipse 새로 깔고

--> workspace2 생성해서 project path 연결

--> workspace2 폴더에 기존 워크스페이스 폴더에서 myspring 복붙

--> 이클립스 실행 후 import로 myspring 폴더 지정

 

 

- 노가다로 일일이 jar파일 받고 넣고 하는 게 결국에는 Maven 을 쓰기 위함

 


- EmpMainSpring 과 EmpMainSpring2 의 내부 차이점

  : 의존하고 있는 클래스가 다르다.


[드디어]

[Maven] 사용..! 

myspring2

new java project 생성

생성 후 프로젝트명 에서 마우스 우클릭 - 메이븐 프로젝트로 컨버트

 

https://mvnrepository.com/tags/spring

↓ 이게 Maven !!

<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.0.20.RELEASE</version>
</dependency>

위 코드를 <myspring2/porm.xml>에 추가해주면

알아서 자동으로 파일들이 생성돼있다.

 

만약 코딩하다가 버전을 다운시켜야 한다면 단지 버전 번호만 입력 후 저장하면 된다. 자동으로 알아서 바뀐다.

 

- build path에 ojdbc6.jar 파일 (복붙 안하고) 이전 프로젝트로부터 바로 경로 설정

 

<context-spring.xml>

<?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">

	<!-- EmpDAO emp = new EmpDAO() -->
	<bean id="empDAO" class="myspring.EmpDAO"></bean><!-- 스프링 bean객체 -->
	<bean id="empService" class="myspring.EmpServiceClass">
		<!-- name에 setter이름(dao)이 있어야 한다. -->
		<!-- setter가 실행되는 구간임 / setter dao => setDao가 실행됨 -->
		<!-- ref="emp"는 bean id와 같아야 한다. -->
		<property name="dao" ref="empDAO"></property>
	</bean>

</beans>

<EmpMainSpring2.java>

package myspring;

import java.util.List;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class EmpMainSpring2 {
	//위 클래스가 의존하는 클래스는? 사용/의존/이용 --> EmpService(인터페이스)를 의존한다.
	
	//EmpDAO를 의존하고 있나요?  X(사용하고 있지 않다, 현재 주석처리 되어있음)
	//EmpServiceImpl을 의존하고 있나요?  X(사용하고 있지 않다, 현재 주석처리 되어있음)
	
   public static void main(String[] args) throws Exception {
      int deptId = 100;
//      EmpServiceImpl emp = new EmpServiceImpl();
//      EmpDAO dao = new EmpDAO();
//      emp.setDao(dao);
      ApplicationContext context = 
            new ClassPathXmlApplicationContext("classpath:context-spring.xml");
      EmpService emp = (EmpService) context.getBean("empService");
      // ↑ 인터페이스만 쓰이고 있는데도 실행이 잘 됨
      // (인터페이스는 바디가 없어서 사실상 인터페이스에서 실행되는 게 아니다(?))
      // 인터페이스로는 실행할 수 없다. 그 인터페이스를 구현한 클래스를 사용하도록 주입해 준다.
      // (외부에서) 의존 주입
      // ↓ EmpService에 선언돼있고, 하위클래스EmpServiceImpl과 EmpServiceClass에 정의돼있는 함수getList가 실행
      List<EmpVO> list = emp.getList(deptId);
      
      for(EmpVO vo : list) {
         System.out.println(vo);
      }
   }

}

<EmpServiceImpl.java>

package myspring;

import java.util.List;

import org.springframework.stereotype.Component;

//EmpService에 선언된 메서드를 재정의/정의 하지 않았기때문에 오류
@Component
public class EmpServiceImpl implements EmpService {
                 //클래스정의             //인터페이스 상속
   
   EmpDAO dao; // dao : 객체변수--> static이라서)
   
   public void setDao(EmpDAO dao) {
      this.dao = dao;
   }
   
   //메서드 정의
   public List<EmpVO> getList(int deptId) throws Exception {
      return dao.getEmpListByDeptId(deptId);
   }

}

<EmpService.java> 인터페이스 생성

package myspring;

import java.util.List;

//함수는 정의 선언=abstract,추상,virtual 호출
//인터페이스는 선언밖에안됨
public interface EmpService {
   //메서드 선언
   public abstract List<EmpVO> getList(int deptId) throws Exception;
      
   }

[ Annotation 알아보기 ]

 

Annotation이 뭔가요? ==> @
- 변수도 아니고

- 함수도 아니며

- 클래스도 아니다.
- 다양한 용도로 쓰지만 주로 마킹하기 위해 사용한다. 도장찍는 것 처럼 ==> @interface로 정의한다.
- 우리가 지금까지 본 annotation에는 뭐가 있을까? => @override

 

<AnnotationTest.java>

Sample클래스 안에 있는 object들
getClass() 안에 있는 Class들

package myspring;

import java.lang.annotation.Annotation;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

public class AnnotationTest {

	public static void main(String[] args) {
		Sample sample = new Sample();
		Annotation[] list = sample.getClass().getAnnotations();
        //getAnno:Class클래스 안에 있는 Annotation배열 리턴타입을 갖는 것
        
		for(Annotation annotation : list) {
			System.out.println(annotation);
		}

	}

}
@Retention(RetentionPolicy.RUNTIME)
@interface
MyAnnotation {
	
}

@MyAnnotation
class Sample extends Object {
	
}

 

- npm을 써봤다 --> VS Code 터미널창에서

흠,, 어렵당