spring은 자바로 이루어진 개발환경인데 현재 한국에서는 정부표준 프레임워크에 해당된다. 스타트업부터 대기업까지 거의 대부분 사용하고 있기 때문에 한국에서 개발자로 취업하기 위해서는 spring을 배워야 한다고 생각한다. 뭐 다른 언어를 배워서 개발을 하는 곳도 있지만 채용 사이트만 봐도 spring개발자 모집이 더 많은 것을 눈으로 확인 할 수 있었다.
spring MVC같은경우에는 직접적으로 환경을 셋팅해야된다. spring boot같은 경우에는 어노테이션@
만 명시해준다면 알아서 컨트롤러가 다 처리해준다. 이 뿐만 아니라 spring MVC에서는 서버가 내장이 되어 있지않기 때문에 직접 깔아서 설치를 해줘야된다.
수업시간에 들은 얘기지만 대기업이나 중소기업에서는 보통 Spring MVC를 많이 사용하고 스타트업에서는 Spring Boot를 많이 쓴다고 한다. 아무래도 Spring MVC같은 경우에는 개발자에게 요구사항이 많다 보니 코드가 길어져서 그런거같다.
Model1은 쉽게 말해서 jsp파일에서 로직처리(controller)와 화면(view)을 보여주는 역할을 한다. 간단한 페이지를 구현할 때는 Model1이 구현하기 좋겠지만, 조금이라도 규모가 커진다면 Model1의 단점이 바로 느껴진다. 한 페이지에 쇼핑몰의 메인 페이지를 구현한다면 코드의 복잡도가 높아질 것이고, 이렇게 되면 유지보수 용이성이 떨어지게 된다.
모든 페이지에 담겨있는 Model1하고 다르게 구성되어있다. Model2는 뷰, 컨트롤러, 모델로 분리되어 있다. 여기서 뷰는 jsp파일이고, 모델은 JavaBeans, 컨트롤러는 서블릿에 해당이 된다. Model1에 비해 좀 복잡해보이지만 로직이 분리되어 있어 유지보수도 용이할 뿐만 아니라 코드의 복잡도가 낮아진다. 하지만 Model1에 비해서는 서비스 흐름의 이해가 어렵기 때문에 자바코드와 Model2에 대한 흐름을 어느정도 알고 있어야 한다.
Model1 | Model2 | |
---|---|---|
클라이언트 요청 | JSP에서 해결 | Servlet을 통해 해결 |
유지보수성 | 복잡함 | 비교적 쉬움 |
페이지 구조 | 단순함 | 복잡함 |
페이지 접근 | 직접요청 | Controller를 통해 요청 |
개발시간 | 짧음 | 비교적 길음 |
우선 결합도를 이해하기 위해선 인터페이스부터 짚고 넘어가야될거같다.
“인터페이스를 이해했으니 결합도란 무엇일까?”
결합도는 서로 다른 모듈끼리의 연관성을 의미한다. 쉽게 말해서, 친구 따라 강남간다라는 속담처럼 친구가 강남을 가면 나도 같이 가게 된다. 이러한 이유는 친구와 내가 그 만큼 친밀도가 높기 때문이다. 여기서 친구와 나는 모듈이고 친밀도는 결합도를 의미한다고 볼 수 있다.
결합도에는 6가지가 있다.
스탬프 결합도
제어 결합도
외부 결합도
공통 결합도
내용 결합도
(결합도 높음) 내용 결합도 → 공통 결합도 → 외부 결합도 → 제어 결합도 → 스탬프 결합도 → 자료 결합도 (결합도 낮음)
class Engine {
void start() {
System.out.println("엔진을 시작합니다.");
}
}
class Car {
private Engine engine;
Car() {
this.engine = new Engine();
}
void startCar() {
engine.start();
System.out.println("자동차를 주행합니다.");
}
}
해당 코드를 보면 Engine클래스와 Car클래스로 되어 있다. Car클래스 내부에서는 Engine클래스를 선언해주고 있고. sartCar()에서 호출이 되고 있다. 이로써 Engine클래스는 Car클래스에 포함이 되는 관계(has-a)관계라고 볼 수 있다.classDiagram
Car *-- Engine
Car: Car()
Car: startCar()
Engine: start()
class Animal {
void eat() {
System.out.println("동물이 먹이를 먹습니다.");
}
}
class Cat extends Animal {
void meow() {
System.out.println("고양이가 야옹 소리를 냅니다.");
}
}
고양이는 동물이다. 동물은 고양이다. 둘 중에 어느 표현이 더 적당한가 물어보면 당연히 고양이는 동물이다.라고 답할 것이다. Cat클래스는 Animal클래스로부터 상속을 받고 있는 것을 볼 수 있다. 이게 바로 is-a관계이다.classDiagram
Animal <|-- Cat
Cat: void meow()
Animal: eat()
Web Application 최상단에 위치하고 있는 Context.
Spring에서 생성되는 Bean에 대한 IoC Container 또는 Bean Container
서로 다른 여러 Servlet에서 공통적으로 공유해서 사용할 수 있는 Bean을 선언.
Application Context에 정의된 Bean은 Servlet Context에 정의 된 Bean을 사용할 수 없다.
classDiagram
BeanFactory --|> ApplicationContext
ApplicationContext --|> ServletContext
Servlet단위로 실행되는 Context
sevlet-context.xml파일은 DispatcherServlet생성 시 필요한 설정 정보를 담은 파일.
Application Context를 부모 Context로 사용한다.
Application Context와 Servlet Context에 같은 id로 된 Bean이 등록되는 경우, Servlet Context에 선언된 Bean을 사용. (오버라이딩)
Servlet Context에 먼저 찾는다.
만약 Servlet Context에서 bean을 못찾는 경우 Application Context에 정의된 bean을 찾는다.
Servlet Context에 정의된 bean은 Application Context의 Bean을 사용할 수 있다.
*퍼시스턴스 프레임워크
이다. 마이바티스는 JDBC로 처리하는 상당부분의 코드와 파라미터 설정및 결과 매핑을 대신해준다. 마이바티스는 데이터베이스 레코드에 원시타입과 Map 인터페이스 그리고 자바 POJO 를 설정해서 매핑하기 위해 XML과 어노테이션을 사용할 수 있다.함수에서 파라미터를 받게되면 파라미터를 저장할 메모리가 생성이 된다 그래서 map형태로 파라미터 1개만 넘겨주면 거기에 알맞는 메모리가 할당이 됨.
*퍼시스턴트 프레임워크:
데이터의 CRUD를 다루는 클래스 및 설정 파일들의 집합이다.
“뒤에 팩토리가 들어가면 관리해주고 조립해주는 역할.”
오브젝트 팩토리 패턴은 객체 생성을 추상화하고 인터페이스를 통해 객체를 생성하는 메커니즘.
팩토리 패턴은 객체 생성을 캡슐화하고 팩토리 클래스를 통해 객체를 생성하는 방법을 제공하는데 중점.
두 패턴은 비슷한 목표를 가지고 있으며, 어떤 상황에 더 적합한지는 사용 사례에 따라 다를 수 있다.
// 1. 객체 생성을 추상화하기 위한 인터페이스
interface Shape {
void draw();
}
// 2. 구체적인 클래스들
class Circle implements Shape {
public void draw() {
System.out.println("원 그리기");
}
}
class Rectangle implements Shape {
public void draw() {
System.out.println("사각형 그리기");
}
}
// 3. 객체 생성을 추상화하는 팩토리 인터페이스
interface ShapeFactory {
Shape createShape();
}
// 4. 구체적인 팩토리 클래스들
class CircleFactory implements ShapeFactory {
public Shape createShape() {
return new Circle();
}
}
class RectangleFactory implements ShapeFactory {
public Shape createShape() {
return new Rectangle();
}
}
public class ObjectFactoryPatternExample {
public static void main(String[] args) {
ShapeFactory factory1 = new CircleFactory();
Shape circle = factory1.createShape();
circle.draw();
ShapeFactory factory2 = new RectangleFactory();
Shape rectangle = factory2.createShape();
rectangle.draw();
}
}
// 1. 객체 생성을 캡슐화하는 팩토리 클래스
class ShapeFactory {
public static Shape createShape(String shapeType) {
if (shapeType.equalsIgnoreCase("CIRCLE")) {
return new Circle();
} else if (shapeType.equalsIgnoreCase("RECTANGLE")) {
return new Rectangle();
}
return null;
}
}
// 2. 구체적인 클래스들
interface Shape {
void draw();
}
class Circle implements Shape {
public void draw() {
System.out.println("원 그리기");
}
}
class Rectangle implements Shape {
public void draw() {
System.out.println("사각형 그리기");
}
}
public class FactoryPatternExample {
public static void main(String[] args) {
Shape circle = ShapeFactory.createShape("CIRCLE");
circle.draw();
Shape rectangle = ShapeFactory.createShape("RECTANGLE");
rectangle.draw();
}
}
xml은 html과 다르게 확장이 가능한 마크업 언어
스프링의 기본 베이스는 계층 아키텍처를 기반으로 하고 있음.
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource
name="jdbc/myora"
auth="Container"
type="javax.sql.DataSource"
driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@localhost:1521:xe"
username="ict01"
password="ict01"
maxActive="20"
maxIdle="10"
maxWait="-1"/>
</Context>
톰캣에 있는 Container에서
<?xml version="1.0" encoding="UTF-8"?>
: XML 파일의 버전 및 인코딩을 지정하는 선언입니다.
<Context>
: 루트 요소로, 모든 데이터베이스 연결 정보를 포함하는 설정 컨테이너입니다.
<Resource>
: 데이터베이스 연결 정보를 정의하는 요소입니다. 이 요소는 다음과 같은 속성을 가지고 있습니다:
- name
: 리소스의 이름을 지정합니다. 이 이름을 사용하여 코드에서 데이터베이스 연결을 요청합니다.
- auth
: 인증 방법을 지정합니다. "Container"로 설정된 경우 컨테이너가 사용자를 인증하며, 일반적으로 데이터베이스 연결에서 사용됩니다.
- type
: 리소스의 유형을 지정합니다. 여기서는 JDBC 데이터 소스를 나타내는 "javax.sql.DataSource"를 사용합니다.
- driverClassName
: 데이터베이스 드라이버 클래스 이름을 지정합니다. 이 경우 Oracle 데이터베이스에 대한 드라이버를 사용하고 있습니다.
- url
: 데이터베이스에 연결할 URL을 지정합니다. 여기서는 Oracle 데이터베이스의 URL을 사용하고 있습니다.
- username
: 데이터베이스 연결을 위한 사용자 이름을 지정합니다.
- password
: 데이터베이스 연결을 위한 비밀번호를 지정합니다.
- maxActive
: 동시에 활성화된 최대 연결 수를 지정합니다.
- maxIdle
: 풀에 유지될 수 있는 최대 유휴 연결 수를 지정합니다.
- maxWait
: 연결 풀에서 대기할 수 있는 최대 시간을 지정합니다. "-1"은 무한 대기를 의미합니다.
이 설정 파일을 사용하면 웹 어플리케이션에서 데이터베이스에 연결할 때 "jdbc/myora"라는 리소스 이름을 사용하여 컨테이너가 설정된 연결 정보를 활용할 수 있습니다.
JNDI → 오라클의 커넥션 풀 이름으로 커넥션 풀에서 데이터베이스에 대한 정보를 가져올수 있게끔 하는 인터페이스.