유디의 공간정보·개발일기
1. 0901_Maven과 근본적인 이해를 위한 노가다 코딩 본문
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
<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>
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 터미널창에서
흠,, 어렵당
'Spring, Mybatis' 카테고리의 다른 글
3-2. 0903_ Mybatis개요(계속), SQL RDBMS, DBeaver (1) | 2021.09.03 |
---|---|
3-1. 0903_ MyBatis 더 알아보기 (0) | 2021.09.03 |
2-3. DBCP를 HikariCP로 변경하기 (0) | 2021.09.02 |
2-2. 0902_ MyBatis (0) | 2021.09.02 |
2-1. 0902_ Maven과 어노테이션 설정(Annotation) (0) | 2021.09.02 |