6/8 목요일 필기 - 드디어 스프링!!

konut ko·2023년 6월 8일
1

더존비즈온5기

목록 보기
30/46

스프링

스프링사이트

  • quick start guides

  • api : 필요한 함수만 사용
  • frame work : 놀 수 있는 환경~! 모든거 다 제공하는 환경임.

  • 우리나라는 전자정부 프래임워크가 가진 버전을 기본으로 한다.

  • SpringBoot : 개발 템플릿
    spring은 프래임워크고 spring boot 는 개발 템플릿임.

  • 개발환경
    Spring - Spring Boot (지원)
    spring은 레거시가 되어따..!!
    spring >> 셋팅: 설정 면에서 개발자에게 따뜻한 봄과 같은 것
    spring boot 더 따뜻한 봄(설정 자동화 시킴. xml을 없애고 의존성 관리가 더 용이해짐)

배울것들



  • 스프링 부트는 개발할 수 있는 환경

기타

  • 코틀린?

  • 레거시 : 기존환경

개발환경 세팅

스프링 레거시 개발환경 세팅

최신버전 링크

  • 스프링에서 툴도 제공

    but : 레거시는 작동 x라서 레거시를 사용하기 위해서는 위 사이트에서 받아야함.

스프링 레거시 프로젝트
프래임웤 5.xx
최신툴 지원 안해주기 때문에 하위 (jdk 11)버전 설치 예정
레거시 버전을 지원하는 툴 다운받아야함(버전 다운)

Spring Boot 개발환경 세팅

https://spring.io/tools

  • jar 파일 형태로 다운받음

    jar형태 다운받는 법 :
    우선 경로 이동 후
    자바 마자 경로파일명쩜자!
    => java -jar 파일명.jar

프로젝트 생성 : Spring Starter Project

  • web 으로 설정

Server Port 설정

spring boot 는 톰캣서버가 내장되어있음
port번호 변경은 src/main/resources 아래
application.properties 파일에서 설정해줌

server.port=8090

서버ERR : 원인 jdk-17이 아닌 11 버전이 잡혀있었음

  • 빌드 추가로 해결함

SpringLabs

SpringDAO_Basic_1 : REFACTORING

  • 나누어진 관심사 (=중복된 관심사)를 하나로 모으자
    => REFACTORING
    예시 ) dao함수마다 안에서 db연결 코드중복 > 함수를 따로 빼는것이 나음
  • 서비스에서 예외처리하는것이 좋음
    자원을 처리하는 곳(=함수를 사용하는 곳)에서 예외처리를 하는 것이 좋음

SpringDAO_Basic_2 : is a (상속)

예시)
소프트웨어 판매 (고객사 마다 요구사항)
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;

}
  • n사 코드
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();
//부모타입 (다형성)

  • 상속으로 해결 문제점 (is a (상속) 관계)
    단일상속/ 부모-자식 관계 밀접(부모변화>> 자식변화)

SpringDAO_Basic_3 : has a (포함)

  • 상속하지말고 요구사항 만족하기
    has a(포함) 관계 활용
    connection클래스의 자원(add등의 함수)을 써야하니까 userDao안에 private 멤버필드로 만들어서
    생성자 함수안에 넣음. (이때 lifecycle이 같으니까 복합연관)
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)

SpringDAO_Basic_4 : interface

N사와 D사가 연결하는 객체는 자신의 회사가 정의하는 이름으로..
-SimpleConnection_N_Maker 클래스 각각의 회사가 정의

이슈 : UserDao 가 SimpleConnectionMaker 의존관계
[느슨하게] 가져가고 싶다 (확장성을 고려해서 == 다형성)

해결방법 : 인터페이스(Interface 사용) > 다형성

N 사 : ConnectionMaker 인터페이스를 구현하는 클래스를 만들어 쓰세요

결국에는 의존성 주입 (생성자를 통해서)
UserDao dao = new UserDao(new NConnectionMaker());
=> UserDao 가 필요로하는 객체를 넣어준것


Spring > 인터페이스 기반 다형성 > 코드를 제공


결론! 스프링은 인터페이스 기반 다형성!!

profile
보초딩코라 틀린 내용 있을 수도 있습니다. 댓글 지적 환영

0개의 댓글