우리나라는 전자정부 프래임워크가 가진 버전을 기본으로 한다.
SpringBoot : 개발 템플릿
spring은 프래임워크고 spring boot 는 개발 템플릿임.
개발환경
Spring - Spring Boot (지원)
spring은 레거시가 되어따..!!
spring >> 셋팅: 설정 면에서 개발자에게 따뜻한 봄과 같은 것
spring boot 더 따뜻한 봄(설정 자동화 시킴. xml을 없애고 의존성 관리가 더 용이해짐)
코틀린?
레거시 : 기존환경
- STS 툴 버전
https://spring.io/tools
스프링 레거시 프로젝트
프래임웤 5.xx
최신툴 지원 안해주기 때문에 하위 (jdk 11)버전 설치 예정
레거시 버전을 지원하는 툴 다운받아야함(버전 다운)
jar형태 다운받는 법 :
우선 경로 이동 후
자바 마자 경로파일명쩜자!
=> java -jar 파일명.jar
spring boot 는 톰캣서버가 내장되어있음
port번호 변경은 src/main/resources 아래
application.properties 파일에서 설정해줌
server.port=8090
예시)
소프트웨어 판매 (고객사 마다 요구사항)
1.N사(Oracle) , D사(Mysql) DB연결 방법이 틀리다
동작하는 코드 자원 > 추상 클래스
재정의하는 부분 > 오버라이드로
적용 )
userDAO abstract로 뺌
package springbook.user.dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import springbook.user.domain.User;
public abstract class UserDao {
//Data Add
public void add(User user) throws ClassNotFoundException , SQLException {
//Class.forName("oracle.jdbc.driver.OracleDriver");
//Connection c = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE","spring","1004");
Connection c = getConnection();
PreparedStatement ps = c.prepareStatement("insert into users(id,name,password) values(?,?,?)");
ps.setString(1, user.getId());
ps.setString(2, user.getName());
ps.setString(3, user.getPassword());
ps.executeUpdate();
ps.close();
c.close();
}
//Data Get
public User get(String id) throws ClassNotFoundException , SQLException {
//Class.forName("oracle.jdbc.driver.OracleDriver");
//Connection c = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE","spring","1004");
Connection c = getConnection();
PreparedStatement ps = c.prepareStatement("select * from users where id =?");
ps.setString(1, id);
ResultSet rs = ps.executeQuery();
rs.next();
User user = new User();
user.setId(rs.getString("id"));
user.setName(rs.getString("name"));
user.setPassword(rs.getString("password"));
return user;
}
//Oracle -> MySql
//중복관심에 대한 하나의 관심사로 모았다(DB연결)
/*private Connection getConnection() throws ClassNotFoundException,SQLException{
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection c = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE","spring","1004");
return c;
}*/
//2차 요구사항
//벤더 마다 다른 연결을 가지고 싶다
//벤더가 자기 회사의 연결을 강제 구현
abstract protected Connection getConnection() throws ClassNotFoundException ,SQLException;
}
package springbook.user.dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class NUserDao extends UserDao {
@Override
protected Connection getConnection() throws ClassNotFoundException,
SQLException {
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection c = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE","springuser","1004");
return c;
}
}
//N사
//NUserDao dao = new NUserDao();
//D사
//DUserDao dao = new DUserDao();
UserDao dao = new NUserDao();
//부모타입 (다형성)
class UserDao{
private SimpleConnectionMaker simpleconnectionmaker;
public UserDao(){
this.simpleconnectionmaker = new SimpleConnectionMaker();
}
}
집합연관
main함수에서 생성해서 사용하는 경우집합연관 class UserDao{ private SimpleConnectionMaker simpleconnectionmaker; public UserDao(SimpleConnectionMaker aaa){ this.simpleconnectionmaker = aaa; } } ---- main 함수 SimpleConnectionMaker m = new SimpleConnectionMaker(); UserDao dao = new UserDao(m)
N사와 D사가 연결하는 객체는 자신의 회사가 정의하는 이름으로..
-SimpleConnection_N_Maker 클래스 각각의 회사가 정의
이슈 : UserDao 가 SimpleConnectionMaker 의존관계
[느슨하게] 가져가고 싶다 (확장성을 고려해서 == 다형성)
해결방법 : 인터페이스(Interface 사용) > 다형성
N 사 : ConnectionMaker 인터페이스를 구현하는 클래스를 만들어 쓰세요
결국에는 의존성 주입 (생성자를 통해서)
UserDao dao = new UserDao(new NConnectionMaker());
=> UserDao 가 필요로하는 객체를 넣어준것
Spring > 인터페이스 기반 다형성 > 코드를 제공
결론! 스프링은 인터페이스 기반 다형성!!