반응형

1. 저급언어

 

0과 1로 이루어진 언어, 기계어라고 부른다.

0과 1로만 되어있으면 해석하기 어렵기 때문에 이를 기호로 만들어 프로그래밍하게 되었다. 어셈블리어 라고 한다.

단, 이 어셈블리어는 컴퓨터가 바로 알아들을 수 없어서 기호를 원래의 숫자로 되돌리는 컴파일러가 필요하게 되었다.

 

 

 

2. 고급언어

 

사람 중심의 언어이다.

사람이 이해하기 쉬운 문법으로 작성된 소스 코드를 컴파일러가 번역하여 컴퓨터에게 전달한다.

앞서 언급한 기호를 숫자로 돌리는 컴파일러와 동일하다.

 

 

 

 

3. HTTP 작동방식

 

HTTP는 서버/클라이언트 모델을 따른다.

  • 장점
    - 불특정 다수를 대상으로 하는 서비스에는 적합하다.
    - 클라이언트와 서버가 계속 연결된 형태가 아니기 때문에 클라이언트와 서버 간의 최대 연결 수보다 훨씬 많은 요청과 응답을 처리할 수 있다.
  • 단점
    - 연결을 끊어버리기 때문에, 클라이언트의 이전 상황을 알 수가 없다.
    - 이러한 특징을 무상태(Stateless)라고 말한다.
    - 이러한 특징 때문에 정보를 유지하기 위해서 Cookie와 같은 기술이 등장하게 되었다.

 

 

4. URL (Uniform Resource Locator)

  • 인터넷 상의 자원의 위치
  • 특정 웹 서버의 특정 파일에 접근하기 위한 경로 혹은 주소

 

 

5. HTTP (Hypertext Transfer Protocol)

HTTP는 서버와 클라이언트가 인터넷상에서 데이터를 주고받기 위한 프로토콜(protocol)

 

  • 요청 메서드 : GET, PUT, POST, PUSH, OPTIONS 등의 요청 방식이 온다.
  • 요청 URI : 요청하는 자원의 위치를 명시한다.
  • HTTP 프로토콜 버전 : 웹 브라우저가 사용하는 프로토콜 버전이다.

첫번째 줄의 요청메소드는 서버에게 요청의 종류를 알려주기 위해서 사용됩니다.

각각의 메소드 이름은 다음과 같은 의미를 가집니다.

참고로 최초의 웹 서버는 GET방식만 지원해줬습니다.

  • GET : 정보를 요청하기 위해서 사용한다. (SELECT)
  • POST : 정보를 밀어넣기 위해서 사용한다. (INSERT)
  • PUT : 정보를 업데이트하기 위해서 사용한다. (UPDATE)
  • DELETE : 정보를 삭제하기 위해서 사용한다. (DELETE)
  • HEAD : (HTTP)헤더 정보만 요청한다. 해당 자원이 존재하는지 혹은 서버에 문제가 없는지를 확인하기 위해서 사용한다.
  • OPTIONS : 웹서버가 지원하는 메서드의 종류를 요청한다.
  • TRACE : 클라이언트의 요청을 그대로 반환한다. 예컨데 echo 서비스로 서버 상태를 확인하기 위한 목적으로 주로 사용한다.

 

 

 

6. 미들웨어 (MiddleWare)

클라이언트 쪽에 비즈니스 로직이 많을 경우, 클라이언트 관리(배포 등)로 인해 비용이 많이 발생하는 문제가 있습니다.

비즈니스 로직을 클라이언트와 DBMS사이의 미들웨어 서버에서 동작하도록 함으로써 클라이언트는 입력과 출력만 담당하도록 합니다.

 

 

 

 

 

 

7. WAS (Web Application Server)

WAS는 일종의 미들웨어웹 클라이언트(보통 웹 브라우저)의 요청 중 웹 애플리케이션이 동작하도록 지원하는 목적을 가집니다.

 

 

 

8. 웹 서버란?

  • 웹 서버는 소프트웨어(Software)를 보통 말하지만, 웹 서버 소프트웨어가 동작하는 컴퓨터를 말합니다.
  • 웹 서버의 가장 중요한 기능은 클라이언트(Client)가 요청하는 HTML 문서나 각종 리소스(Resource)를 전달하는 것입니다.
  • 웹 브라우저나 웹 크롤러가 요청하는 리소스는 컴퓨터에 저장된 정적(static)인 데이터이거나 동적인 결과가 될 수 있습니다.

 

 

 

웹 서버 소프트웨어의 종류

  • 가장 많이 사용하는 웹 서버는 Apache, Nginx, Microsoft IIS
  • Apache웹 서버는 Apache Software Foundation에서 개발한 웹서버로 오픈소스 소프트웨어(Open-source Software)이며, 거의 대부분 운영체제에서 설치 및 사용을 할 수 있습니다.
  • Nginx는 차세대 웹서버로 불리며 더 적은 자원으로 더 빠르게 데이터를 서비스하는 것을 목적으로 만들어진 서버이며 Apache웹 서버와 마찬가지로 오픈소스 소프트웨어입니다.

 

 

 

 

웹 서버 vs WAS

  • WAS도 보통 자체적으로 웹 서버 기능을 내장하고 있습니다.
  • 현재는 WAS가 가지고 있는 웹 서버도 정적인 콘텐츠를 처리하는 데 있어서 성능상 큰 차이가 없습니다.
  • 규모가 커질수록 웹 서버와 WAS를 분리합니다.
  • 자원 이용의 효율성 및 장애 극복, 배포 및 유지보수의 편의성을 위해 웹서버와 WAS를 대체로 분리합니다.
반응형
반응형

JDBC란? (Java Database Connectivity)

- 자바 프로그램 내에서 SQL문을 실행하기 위한 자바 API

 

즉, DB와 자바 프로그램을 연결시켜주는 연결 다리의 역할을 한다는 것이다.

 

 

JDBC 클래스 생성 관계

 

 

 

 

SELECT DAO 예제

public Role getRole(String name) {

	Role role = null;
	Connection conn = null;
	PreparedStatement ps = null;
	ResultSet rs = null;

	try {
		Class.forName("com.mysql.jdbc.Driver");
		conn = DriverManager.getConnection(dburl, dbUser, dbpasswd);
		String sql = "SELECT name, tel FROM card WHERE name = ?";
		ps = conn.prepareStatement(sql);
		
		ps.setString(1, name);
		
		rs = ps.executeQuery();            // select는 executeQuery() 이용
										   // ResultSet type의 변수에 결과 입력

		if (rs.next()) {
			String name1 = rs.getString("name");
			String tel1 = rs.getString("tel");
			role = new Role(name1, tel1);
		}
	} catch (Exception e) {
		e.printStackTrace();
	} 
	finally {
		if (rs != null) {
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if (ps != null) {
			try {
				ps.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if (conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}

	return role;
}

 

 

 

 

INSERT DAO 예제

public int addRole(Role role) {

	int insertCount = 0;
	Connection conn = null;
	PreparedStatement ps = null;

	try {
		Class.forName("com.mysql.jdbc.Driver");
		conn = DriverManager.getConnection(dburl, dbUser, dbpasswd);
		String sql = "INSERT INTO card (name, tel) VALUES ( ?, ? )";
		ps = conn.prepareStatement(sql);
	
		ps.setString(1, role.getName());
		ps.setString(2, role.getTel());

		insertCount = ps.executeUpdate();	// insert, delete, update는 executeUpdate() 이용
											// int type 변수에 결과 입력
	} catch (Exception ex) {
		ex.printStackTrace();
	} finally {
		if (ps != null) {
			try {
				ps.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if (conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
	return insertCount;
}

 

 

 

 

 

DELETE DAO 예제

public int deleteRole(Integer roleId) {

	int insertCount = 0;
	Connection conn = null;
	PreparedStatement ps = null;

	try {
		Class.forName("com.mysql.jdbc.Driver");
		conn = DriverManager.getConnection(dburl, dbUser, dbpasswd);
		String sql = "DELETE from role where role_id = ?";
		ps = conn.prepareStatement(sql);
	
		ps.setInt(1, roleId);

		insertCount = ps.executeUpdate();	// insert, delete, update는 executeUpdate() 이용
											// int type 변수에 결과 입력
	} catch (Exception ex) {
		ex.printStackTrace();
	} finally {
		if (ps != null) {
			try {
				ps.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if (conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
	return insertCount;
}

 

 

 

 

UPDATE DAO 예제

public int updateRole(Role role) {

	int insertCount = 0;
	Connection conn = null;
	PreparedStatement ps = null;

	try {
		Class.forName("com.mysql.jdbc.Driver");
		conn = DriverManager.getConnection(dburl, dbUser, dbpasswd);
		String sql = "UPDATE role set description = ? where role_id = ?";
		ps = conn.prepareStatement(sql);
	
		ps.setString(1, role.getDescription());
		ps.setInt(2, role.getRoleId());

		insertCount = ps.executeUpdate();	// insert, delete, update는 executeUpdate() 이용
											// int type 변수에 결과 입력
	} catch (Exception ex) {
		ex.printStackTrace();
	} finally {
		if (ps != null) {
			try {
				ps.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if (conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
	return insertCount;
}

 

 

DriverManager를 이용해 connection을 가져오고,

conn 객체를 이용해 statement를 가져오고,

statement를 통해 ResultSet을 가져옴을 확인할 수 있다.

 

 

 

 

 

 

JSP란?  (java server page)

 

 

JSTL이란? (JSP Standard Tag Library)

- JSTL은 JSP 페이지에서 조건문 처리, 반복문 처리 등을 html tag형태로 작성할 수 있게 도와준다.

 

JSP 페이지에서 자바 언어와 프론트엔드 언어가 섞여있으면 다루기 힘드니까, 자바 언어를 html tag 형태로 작성할 수 있도록 도와주는 것이다.

 

 

서블릿이란?

반응형
반응형

@SpringBootTest는 @SpringBootApplication 부터 시작하는 모든 빈을 스캔하고 등록해준다.

 

 

1. 시작은 spring-boot-starter-test 의존성 추가하는 것부터!

저는 스프링 이니셜라이져로 생성해서 자동으로 추가되었습니다.

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-test</artifactId>
	<scope>test</scope>
	<exclusions>
		<exclusion>
			<groupId>org.junit.vintage</groupId>
			<artifactId>junit-vintage-engine</artifactId>
		</exclusion>
	</exclusions>
</dependency>

pom.xml

 

 

 

2. main 코드

package com.example.springboottest.sample;

import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class SampleController {

    @Autowired
    private SampleService sampleService;

    @GetMapping("/hello")
    public String hello(){
        return "hello" + sampleService.getName();
    }
}

SampleController.java

 

 

@Service
public class SampleService {
    public String getName() {
        return "naeun";
    }
}

SampleService.java

 

 

 

3. @SpringBootTest

  • @RunWith(SpringRunner.class)랑 같이 써야 함.
  • 빈 설정 파일은 설정을 안해주나? 알아서 찾습니다. (@SpringBootApplication)

 

4. webEnvironment

  • MOCK: mock servlet environment. 내장 톰캣 구동 안 함.
  • RANDON_PORT, DEFINED_PORT: 내장 톰캣 사용 함.
  • NONE: 서블릿 환경 제공 안 함.

 

 

 

 

여기서 잠깐! Mock란?

실제 객체를 만들기엔 비용과 시간이 많이 들거나 의존성이 길게 걸쳐져 있어 제대로 구현하기 어려울 경우, 가짜 객체를 만들어 사용하는데, 이를 Mocking 이라고 한다.

 

여기서 잠깐! Dispatcher-Servlet이란?

Servlet Container에서 HTTP프로토콜을 통해 들어오는 모든 요청을 프레젠테이션 계층의 제일앞에 둬서 중앙집중식으로 처리해주는 프론트 컨트롤러(Front Controller)이다. 클라이언트로부터 어떠한 요청이 오면 Tomcat(톰캣)과 같은 서블릿컨테이너가 요청을 받는데, 이때 제일 앞에서 서버로 들어오는 모든 요청을 처리하는 *프론트 컨트롤러를 Spring에서 정의하였고, 이를 Dispatcher-Servlet이라고 합니다. 

 

여기서 잠깐! Front Controller란?

Front Controller는 주로 서블릿 컨테이너의 제일 앞에서 서버로 들어오는 클라이언트의 모든 요청을 받아서

처리해주는 컨트롤러인데, MVC 구조에서 함께 사용되는 패턴이다.

 

여기서 잠깐! @Autowired란?

이 어노테이션을 부여하면 각 상황의 타입에 맞는 IoC컨테이너 안에 존재하는 빈을 자동으로 주입해준다.

 

 

 

 

1) WebEnvironment 가 MOCK 일 때,

MockMVC 라는 클라이언트를 사용하려면

 

-> mockup이 된 서블릿과 인터렉션 하려면 MockMVC라는 클라이언트가 필요하다.

@AutoConfigureMockMvc : 어노테이션 추가

@Autowired
MockMvc mockMvc; : 본문에 추가

 

package com.example.springboottest.sample;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import static org.junit.jupiter.api.Assertions.*;

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK)
@AutoConfigureMockMvc
public class SampleServiceTest {

    @Autowired
    MockMvc mockMvc;

    @Test
    public void hello() throws Exception {
        mockMvc.perform(get("/hello"))
                .andExpect(status().isOk())
                .andExpect(content().string("hellonaeun"))
                .andDo(print());
    }
}

SampleControllerTest.java

 

 

이렇게 하고 hello를 run하면 ! 에러가 뜬다...

junit 버전이 12이상 필요하다고 해서 12로 고쳐주었더니 잘 작동된다.

 

-> 여러가지 정보들을 보여준다.

 

 

 

 

 

2) WebEnvironment 가 RANDOM_PORT 일 때, (내장 톰캣이 뜸)

test용 restTemplate나 test용 client를 사용해야 한다. 

 

먼저 restTemplate을 사용해보자.

테스트할 때마다 Service단위로 가져오는게 부담스럽기 때문에 가짜 객체를 만들어준다.

-> @MockBean

  • ApplicationContext에 들어있는 빈을 Mock으로 만든 객체로 교체 함.
  • 모든 @Test 마다 자동으로 리셋.
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.when;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class SampleControllerTest {

    @Autowired
    TestRestTemplate testRestTemplate;

    @MockBean
    SampleService mockSampleService;

    @Test
    public void hello() throws Exception {
        when(mockSampleService.getName()).thenReturn("whiteship");

        String result = testRestTemplate.getForObject("/hello",String.class);
        assertThat(result).isEqualTo("hellowhiteship");

    }
}

SampleControllerTest.java

 

둘 다 whiteship으로 변경하여 테스트해보니 정상적으로 작동한다.

 

 

 

 

다음으로 webTestClient를 사용해보자.

webTestClient 는 RestTemplate과 다르게 비동기 방식이다.

 

 

webflux 의존성 추가해준다.

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

 

 

test용 client 사용을 위해 restTemplate 대신,

@Autowired
WebTestClient webTestClient; 을 추가해준다.

package com.example.test2.sample;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.reactive.server.WebTestClient;
import org.springframework.test.web.servlet.MockMvc;

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.when;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class SampleControllerTest {

    @Autowired
    WebTestClient webTestClient;

    @MockBean
    SampleService mockSampleService;

    @Test
    public void hello() throws Exception {
        when(mockSampleService.getName()).thenReturn("whiteship");

        webTestClient.get().uri("/hello").exchange()
                .expectStatus().isOk()
                .expectBody(String.class).isEqualTo("hellowhiteship");

    }
}

SampleControllerTest.java

 

 

 

 

 

 

 

슬라이스 테스트

  • 레이어 별로 잘라서 테스트하고 싶을 때
  • @JsonTest
  • @WebMvcTest
  • @WebFluxTest
  • @DataJpaTest
  • ...
반응형
반응형

3.2.1 BeanFactory

빈 팩토리는 여러 개의 빈 객체를 생성하고, 이를 구성하고, 관리하는 컨테이너이다. 

 

빈들끼리는 서로 협력하고 서로 간의 의존성을 가진다. 이 의존성들은 빈 팩토리의 구성 데이터에 반영이 된다. (어떠한 의존성들은 보이지 구성 데이터에 보이지 않지만, 런타임 때 함수로서 작동이 된다.)

 

빈 팩토리는 org.springframework.beans.factory.BeanFactory 라는 인터페이스에 나타나며 이곳에는 여러가지 구현이 되어 있다. ApplicationContext도 빈 팩토리의 하위 클래스이나, 가장 많이 사용되는 구현은 org.springframework.beans.factory.xml.XmlBeanFactory이다. 이처럼 빈 팩토리에 의해 관리되는 구현을 사용할 때에도 빈 팩토리에 대해 알 필요는 없다. 빈 팩토리가 어떤 방식으로든 객체화 되어 있기 때문이다.

 

많은 경우, 빈 팩토리와 Application Context 객체를 생성할 필요가 없다. 스프링 프레임워크에서 해주기 때문이다. 처음에 dependencies 설정할 때 wep-app 부분에 포함되어 있는 듯 하다.

 

 

 

 

빈 팩토리의 구성은 빈 팩토리가 관리해야 하는 빈의 정의로 이루어져 있다. XmlBeanFactory의 경우, 상위 빈 요소 안의 빈들로 구성되어 있다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
  
  <bean id="..." class="...">
    ...
  </bean>
  <bean id="..." class="...">
    ...
  </bean>

  ...

</beans>

XmlBeanFactory

 

 

 

 

 

3.2.2 빈 정의

빈 정의는 다음의 세부사항을 포함한다.

 

1)  클래스 이름

2) 빈이 컨테이너에서 어떻게 동작해야 하는지를 나타내는 빈 동작 구성 요소

3) 새로 생성된 빈에 설정할 생성자 인수 및 속성 값

4) 빈이 작업을 수행하는 데 필요한 다른 빈 즉, 협력자

 

이 개념들은 빈 정의가 구성하는 요소 집합으로 직접 변환된다.

 

1) 클래스

2) 아이디, 이름

3) 싱글톤, 또는 프로토타입

4) 생성자 인수

5) 빈 속성

6) AutoWiring 모드

7) 의존성 검사 모드

8) 초기화 방법

9) 파기 방법

 

빈 정의는 실제 인터페이스 org.springframework.beans.factory.config.BeanDefinition 에 구현이 되어 있다는 점을 참고하자.

빈 팩토리 외에서 커스텀하게 만들어진 빈을 등록하는 것도 허용한다. DefaultListableBeanFactory는 registerSingleton method를 통해 이 등록과정을 지원한다.

 

 

 

 

 

 

3.2.3 빈 클래스

클래스 속성은 일반적으로 필수적이다. 그리고 두 가지 중 하나의 목적으로 사용된다. 빈 팩토리가 생성자를 호출하여 스스로 빈을 만들어내는 경우(자바에서 new 연산자와 동일하다), 클래스 속성은 생성할 빈을 지정한다. 빈 팩토리가 static factory 방법을 사용하는 드문 상황에서는 클래스 속성이 실제 static factory를 포함하는 클래스를 지정한다.

 

3.2.3.1 생성자를 통한 빈 생성

생성자를 통해 빈을 생성한 경우, 스프링이 모든 일반적인 클래스를 사용할 수 있고 호환이 가능하다. 즉, 이렇게 만들어진 클래스는 인터페이스를 직접 구현하거나 특정 방식으로 코딩할 필요가 없다. 다만, 어떤 IoC 컨테이너를 사용하느냐에 따라 빈 생성자를 추가해줘야 할 때도 있다.

 

게다가, 빈 팩토리는 자바 빈 말고도 다른 어떤 클래스도 관리할 수 있다. 대부분의 사람들이 자바 빈을 빈 팩토리에 등록하여 사용하는 것을 선호하지만, 빈이 아닌 클래스도 스프링이 관리하여 사용할 수 있다.

 

 

 

3.2.3.2 static factory를 이용한 빈 생성

static factory나 static factory 방법을 포함하는 클래스를 지정하는 클래스 속성을 사용할 때에, 또 다른 속성인 factory-method에는 factory 자기자신의 이름을 명시에 주어야 한다. 스프링이 이 이름을 부르고, 다시 생성자를 통해 만든 객체 상태로 되돌리기를 기대하기 때문이다. 빈 정의를 사용하는 이유 중 하나가 정적 팩토리를 부르기 위해서이다. 밑에 코드에서 createInstance는 static 이어야 한다.

 

<bean id="exampleBean"
      class="examples.ExampleBean2"
      factory-method="createInstance"/>

 

 

 

 

 

3.2.3.3 instance factory를 이용한 빈 생성

이것은 위의 static factory를 이용한 빈 생성과 유사하지만, instance는 non-static이라는 점에서 차이가 있다. 여기에서 기존 빈의 팩토리 메소드를 호출하여 새로운 빈을 생성한다. 이 메커니즘을 사용하려면 클래스 속성을 비워두어야 하며, factory-bean 속성은 팩토리 메소드를 포함하는 조상빈의 이름으로 해야 한다.

 

<!-- The factory bean, which contains a method called
     createInstance -->
<bean id="myFactoryBean"
      class="...">
  ...
</bean>
<!-- The bean to be created via the factory bean -->
<bean id="exampleBean"
      factory-bean="myFactoryBean"
      factory-method="createInstance"/>

 

 

 

 

 

 

3.2.4 빈 식별자

모든 빈은 한 개나 두 개의 id를 가지고 있다. 대부분 한 개를 가지고 있지만, 두 개라면 이는 본질적으로 별칭으로 고려된다. id 속성을 사용하면 하나의 id를 입력할 수 있다. 만약 id가 XML에서 유효하지 않거나, 두 개의 id를 작성하고 싶다면 콜론이나 세미콜론으로 구분하거나 이름 속성에 작성하면 된다.

 

 

 

3.2.5 싱글톤으로, 혹은 비 싱글통

빈은 싱글톤이거나 비 싱글통 중 하나의 모드로 결정이 된다. 빈이 싱글톤인 경우, 하나의 공유 인스턴스만이 빈에 의해 관리된다

반응형
반응형

운영체제가 없어도 컴퓨터 하드웨어는 사용이 가능하다. 다만, 운영체제는 컴퓨터의 사용을 용이하게 해주는 역할을 한다.

 

1. 운영체제 서비스

: 프로그래머와 사용자들에게 편리한 서비스 제공

: 자원관리의 효율성을 위한 서비스

 

 

2. 운영체제의 구성요소

: 인터페이스 / 자원관리 / 자체관리기능

 

- 인터페이스

: 명령어 해석기 시스템

 

- 자원관리 -> 전통적 의미의 운영체제

: 프로세스

: 메모리, 보조 기억 장치

: 입출력, 파일, 네트워크

 

-자체관리

: 부팅 및 초기화

: 시스템 생성 및 튜닝

운영체제의 구성요소

 

 

 

 

 

 

3.  사용자 인터페이스

명령 라인 해석기(Command Line Interpreter) : Shell

Graphic User Interface 

 

 

시스템 호출

: 프로세스와 운영체제 간의 인터페이스(API)

- 프로그램에서 명령 또는 서브 루틴의 호출 형태로 실행한다.

- 시스템에서 명령 해석기를 통해 대화 형태로 호출한다.

 

시스템 호출의 원리

 

 

 

 

 

4. 자체 관리

- 부트스트래핑(부팅)

: 운영체제에서 자기 자신을 적재하는 과정

 

1) 부트스트랩 로더

: 전원 입력시 ROM에 있는 작은 로더가 실행된다.

: 로더는 디스크에 있는 부트스트랩 로더를 메모리에 적재하고 실행시킨다.

: 운영체제를 적재하고 초기화시킨다.

2) 운영체제의 초기화

: 시스템 장치의 초기화

: 명령어 해석기 등을 적재하여 실행시킨다.

 

 

 

 

 

 

4. 운영체제 구조

1) 단순 구조

: 모듈로 분할되지 않는다.

: 수행효율은 높으나 기능 추가 및 유지 보수에 어려움이 있다.

: MS-DOS, 초기의 UNIX

 

 

 

2) 계층 구조

- 모듈성

: 하나의 프로그램을 서로 영향받지 않는 부분들로 분리한다.

: 시스템 오류 제거와 검증에 용이하다.

 

- 계층 기법(Layer)

: 운영체제를 여러 계층으로 나눈다.

: 각 계층은 하위 계층에서 제공되는 기능과 서비스만을 사용한다.

 

- 계층 구조의 어려움

: 계층의 정의 또는 결정

: 계층 정의에 위배되는 경우가 자주 발생한다.

 

 

 

3) 마이크로커널 구조

: 커널로부터 많은 기능을 제거하고 "사용자"공간으로 이전

: 커널은 최소한의 프로세스 및 메모리 관리와 통신 기능을 담당한다.

MACH, QNX, Windows NT

 

[ 장점 ] 

- 운영체제 확장의 용이성

- 운영체제를 새로운 하드웨어로 포맷하기가 쉽다.

- 보안과 신뢰성

 

 

 

 

 

 

 

4) 가상 기계(Virtual Machine)

: 하드웨어와 운영체제 커널을 모두 하드웨어처럼 취급한다.

: 각 프로세스는 실제 컴퓨터의 사본을 제공함으로써 마치 실제 컴퓨터를 사용하는 것과 같은 환경을 제공한다.

-> 조금 더 진화된 것이 "도커"

 

- 자바 가상 기계(JVM)

 

 

 

 

 

 

 

5. 운영체제의 발전 과정

1970년대 UNIX 개발

1980년대 개인용 컴퓨터를 위한 운영체제의 발전

 

 

 

 

1) 일괄처리 시스템(Batch System)

: 유사한 작업들을 묶어서 순차적으로 처리한다.

 

- 상주 모니터

: 메모리에 상주하여 CPU 등 자원의 비효율적 사용을 해결한다.

: 입출력 관리 또는 인터럽트 처리 루틴들의 집합

 

- 제어 카드

: 상주 모니터의 프로그램 수행을 지시한다.

 

- 오프라인 처리

: 위성 컴퓨터, 테이프, 카드, 프린트, 장치 독립성 보장

 

 

 

 

 

 

2) 다중 프로그래밍

: 동시에 실행 상태에 있는 프로세스가 여러 개

-> 자원의 공유가 필요하다. (CPU, 메모리, 주변장치 등)

 

 

 

 

 

 

3) 시분할 시스템(Time Sharing) = 대화형 처리 시스템

: 시간을 나누어서 처리한다.

-> 다중 프로그래밍을 통해 각 사용자가 컴퓨터를 분할하여 사용

-> 메모리와 디스크 사이에 교체 필요

 

 

 

대화형 처리 시스템 vs 일괄 처리 시스템

- 일괄 처리 시스템

: 한 사용자가 주문을 끝까지 받고, 그 다음 사람이 순서대로

: 작업을 준비하여 제출하면 일정 시간 내 결과가 나온다 .

: 반환 시간이 길다. 대화가 거의 필요없는 대형 작업에 적합하다.

 

- 대화형 처리 시스템

: 여러 사용자를 이 사람, 저 사람 번갈아가며 동시에

: 사용자와 시스템 간에 온라인 통신 마련

: 사용자가 컴퓨터에 직접 명령을 주고 응답을 받는다.

 

 

 

 

 

 

 

 

4) 입출력 버퍼링

: 입출력 데이터를 버퍼에 미리 담아오는 것

: 입출력장치와 CPU의 속도 차이를 해소시킨다.

: 한 작업의 계산과 함께 입출력을 동시에 수행한다.

: 버퍼를 사용하여 문자나 데이터를 미리 읽어온 후, 필요할 때마다 사용하게 하면 효율적이다.

 

 

 

 

 

 

 

 

5) 스풀링

: 버퍼를 하드디스크로

: 디스크의 일부 공간을 스풀 공간이라고 부르는 매우 큰 버퍼처럼 사용한다.

: 입출력장치와 CPU의 속도 차이 해소해준다.

 

- 다중 프로그래밍 환경에서 스풀링을 사용한다.

: 다수의 프로세스들이 동시에 입출력을 요구하거나 입출력 장치 수에 제한이 있기 때문에 스풀링을 사용한다.

: 다수의 프로세스에게 각각 독립적인 입출력 장치를 제공한다.

 

 

 

 

 

 

 

 

 

 

6) 병렬 시스템 = 다중 처리기

: 고만고만한 CPU가 여러개 있는 시스템

 

<장점>

- 처리율 증가

- 다양한 주변 장치 공유

- 신뢰성 향상 

 

<단점>

- 프로그래밍 작성이 어려움

 

연결구조

 

 

 

 

7) 분산 시스템

: CPU와 메모리가 각각 별도로 존재 (병렬 시스템은 CPU만 여러개이고, 메모리와 입출력장치는 하나이다)

: 느슨하게 결합

<장점> 자원공유, 계산의 신속화, 신뢰성, 통신

 

 

 

 

 

 

 

 

 

8) 실시간 시스템

: 실행 완료 데드라인이 있다.

-> 특수 목적 시스템에 이용 (공정 제어, 의료 영상, 자동차 엔진 제어)

 

- 경성 실시간 시스템 : 데드라인 반드시 만족

ex) 항공 제어

- 연성 실시간 시스템 : 데드라인 일정 수준 이상 만족

ex) 멀티미디어 서비스

반응형
반응형

 

 

 

 

0. 관리자 모드에서 gcc 설치

$ su

암호 : 

$ yum install gcc

y/n 물을 때마다 y

 

 

1. gcc란?

GNU에서 만든 컴파일러

: C or C++에서 작성된 프로그램을 CPU가 이해할 수 있는 실행파일로 변경

 

 

 

2. 한 개의 소스파일을 이용하여 실행파일 만들기(컴파일하기)

: gcc hello.c    -> 아무런 옵션이 없으면 a.out 이라는 이름의 실행파일이 자동으로 생성

: gcc hello.c -o hello ->hello라는 이름의 실행파일이 생성

 

 

 

4. 두 개 이상의 소스파일을 이용하여 실행파일 만들기

: gcc -c test1.c     -> test1.o 라는 오브젝트 파일 생성

: gcc -c test2.c  -> test2.o 라는 오브젝트 파일 생성

: gcc test1.o test2.o -o run

 

 

 

 

 

 

 

 

 

 

 

반응형

+ Recent posts