웹개발하면서 DB를 연동하는 방법은 여러가지가 있습니다.

오늘은 DB와 연결하는 방법을 정리해보도록 하겠습니다.

 

목차
- DAO DTO를 이용하여 DB연동하기
- JDBC를 이용하여 DB 연결하기
- MyBatis를 이용하여 DB 연결하기
 1) XML 이용하여 SQL 작성
 2) Mapper Class를 이용하여 SQL 작성
- Connection Pool

 

1. DAO DTO를 이용하여 DB 연동하기

가장 기초적인 DB 연결 방법입니다.

DAO에 객체에 DB 로그인 정보를 작성해두고 필요할때마다
연결하는 방법 입니다.

사용 예시로 봅시다

 

 

 

 

'WEB 개발 > Spring 개념' 카테고리의 다른 글

Servlet / Container란?  (0) 2019.03.31
MVC 패턴  (0) 2019.03.28
웹 서비스 과정 - Client - Server 구조  (0) 2019.03.28

예제를 볼때는 트리를 이용해서 DFS/BFS 탐색 이론을 배운다.

그리고 다음과 같은 예제 보고 "각자 BFS/DFS 탐색 방식 구현해보는 실습하세요~"라고 하면 멘붕

사진 1. 트리 예제

 

이론을 알겠는데, 막상 구현해볼라하면 어떻게 하지? 라는 생각이 든다. 
(수업할때 나 빼고 다 아는것 같았음.. 난 몰랐어서 정리 ㅎ)

 

일반적으로 트리를 표현할 때에는 인접행렬 혹은 인접리스트 이렇게 2가지 방식으로 구현한다.

 

1. 인접행렬

인접행렬? 말 그대로다. 2차원 배열로 구현하는 것이다. 

사진 2. 트리 - 인접행렬

	int[][] arr = {{0,1,1,0,0}, {1,0,0,0,0}, {1,0,0,1,1}, {0,0,1,0,0}, {0,0,1,0,0}};

너무 당연한가?  ㅋㅋㅋㅋㅋ (1,1)~(5,5) 대각선 기준으로 대칭이 되는 것을 볼 수 있다.

 

2. 인접리스트

인접리스트는 그래프를 이용하여 구현한다. 인접 행렬에 비해 눈으로 보고 이해하기 더 쉽다. (개인적인 의견임)

package java_BFS_DFS_basic;
import java.util.LinkedList;
/*
 * DFS - 그래프를 이용하여 구현
 * 그래프 구현방법 - 인접행렬 / 인접리스트 방식 중 
 * 인접리스트를 이용하여 구현
*/

public class Graph {
	 	private LinkedList<Integer>[] adj; //인접 리스트 생성
	    private int v; //vertex - 정점
	    
	    // 그래프 생성 및 초기화
	    Graph(int v){
	    	this.v = v; //정점 개수 초기화
	    	//visit = new boolean[v]; // 체크를 위한 값 생성
	    	adj = new LinkedList[v+1]; // v로 하면 0부터 시작하니까, 보기 쉽게 1부터함. 0은 공백으로 둠
	    	//인접리스트 초기화 작업
	    	for(int i=0; i<v+1; i++) {
	    		adj[i] = new LinkedList();
	    	}
	    }
	    
	    // 그래프 인자끼리 연결하기
	    void addEdge(int v1, int v2) {
	    	adj[v1].add(v2);
	    	adj[v2].add(v1);
	    }
	 
	    
	    public static void main(String args[]) {
	    	Graph dfs_g = new Graph(5);
	  
	        dfs_g.addEdge(1, 2);
	        dfs_g.addEdge(1, 3);
	        dfs_g.addEdge(3, 4);
	        dfs_g.addEdge(3, 5);
	        
	        //인자값 1부터 출력
	        for(int i=1; i<dfs_g.adj.length; i++) {
	        	System.out.println(i+" : "+dfs_g.adj[i]);
	        }   
	    }
}


출력결과 :
1 : [2, 3]
2 : [1]
3 : [1, 4, 5]
4 : [3]
5 : [3]

코딩 테스트에서 구현할때는 주로 행렬 형태로 많이 주니까, 행렬로 연습하는 것이 좋을 듯 싶다.
근데 최단경로 간선에 값이 추가된다면 인접리스트로 구현하고 푸는것이 나을수도 있다는 생각이듬

아무튼 방법은 2가지 이고, 경우에 따라 효율적이라고 생각하는 방식으로 만들어서 풀면 될 듯 하다.

 

 

DFS를 이용하는 문제를 예로 들자면 주로 넓이 구하는 문제/ 길찾기 문제일 것입니다.

그 중 부분적인 넓이를 구하는 문제를 풀면서 정리를 좀 해보져

 

1. 문제

다음과 같은 행렬이 있다고 하자

사진 1. 행렬 영역 구하기 문제

그리고 오른쪽에 표시한 것과 같이 3부분으로 나뉘고 각각 넓이는 6/2/8 이다.

이렇듯 행렬의 각각의 영역의 넓이를 구하는 문제를 DFS를 활용하여 풀어본다.

 

2. 문제풀이

풀이 방법은 0,0 부터 탐색한다.
1. 0,0부터 시작해서 상하좌우로 움직이며 1인 곳만 탐색
2. 0을 만나면 끝내기
(DFS인데 Stack을 이용 안한 이유는 재귀함수를 이용할 경우 재귀함수 불릴때마다 메모리에 스택으로 쌓이고 처리하기 때문에 따로 Stack 만들진 않았다.)

 

3. 자바 코드

package java_BFS_DFS_basic;
import java.util.ArrayList;
/*
 * DFS를 이용하여
 * (NxN)인접행렬 넓이 구하기
 * */
public class adjMatrics_DFS {
	 private static int[] X = {-1,0,1,0}; // X축의 상하좌우 이동을 위한 배열 
	 private static int[] Y = {0,1,0,-1}; // Y축의 상하좌우 이동을 위한 배열 (x,y 짝만 맞추어주면 상하좌우든 하좌우상 이든 순서 상관x)
	 private static int[][] map;
	 private static int cnt=1;
	 
	 
	 public static void main(String[] args) {
		// TODO Auto-generated method stub
		ArrayList<Integer> arr = new ArrayList<Integer>(); //각 영역의 넓이를 저장할 ArrayList 생성
		adjMatrics_DFS b = new adjMatrics_DFS(); 
		int[][] map = {{1,1,1,0,1},
					   {1,1,0,0,1},
					   {1,0,1,1,0},
					   {0,0,1,1,1},
					   {0,0,1,1,1}};
		boolean[][] check = new boolean[map.length][map[0].length]; //방문한 곳을 체크하기 위한 배열 행렬 생성
		
		for(int i=0; i<map.length; i++) {
			//System.out.println("다음 찾기 시작");
			//(0,0) 부터 탐색 시작 후 1을 만나면 넓이 구하기 시작
			for(int j=0; j<map[i].length; j++) {
				if(map[i][j] == 1) {
					b.dfs(i,j,check,map);
					arr.add(cnt);
					cnt = 1;
				}
			// 아닌경우 continue
				else
					continue;
			}
		}
	//	System.out.println("프로그램 종료");
		System.out.println("arr : "+ arr);
	}
	 
	 public void dfs(int x, int y, boolean[][] ck,int[][] map) {
		 
		 System.out.println(x+","+y);
		 ck[x][y] = true;
		 map[x][y] = 0;
		 
		 for(int i=0; i<4; i++) {
			 int nextX = x + X[i];
			 int nextY = y + Y[i];
			//상,하,좌,우 이동 중 범위가 넘어서는 경우 continue
			if(nextX <0 || nextY<0 || nextX>=ck.length || nextY>=ck.length) {continue;}
			//방문한곳은 continue
			if(ck[nextX][nextY]){continue;}
			//0은 벽이라서 이동할 경로가 벽이면 continue
			if(map[nextX][nextY] == 0) {ck[nextX][nextY] = true; continue;}
			
			dfs(nextX,nextY,ck,map);
			cnt++;
		 }
		 //System.out.println("END");
		 //System.out.println();
	 }
}

 

출력 결과 :  arr : [6, 2, 8]

 

DFS / BFS 이론은 알겠는데, 문제를 풀다보면 어떻게 구현하지? 라는 생각이 많이 든다.
그래서 다음글엔 DFS / BFS를 어떻게 구현할지 정리해 본다.

오늘은!!

코딩테스트를 볼때 DFS/BFS를 이용해야 풀 수 있는 문제들이 자주 출제 되기 때문에, DFS / BFS 알고리즘에 관하여 정리하려고 합니다.

시작~

 

목차

  1. DFS 알고리즘이란?
  2. 이진 탐색을 이용한 DFS 탐색 순서 알아보기

 

 

 

 

 

1. DFS(Dept First Search) 알고리즘 이란?

Dept First Search(이하 DFS)는 깊이를 우선 탐색하는 알고리즘 이다.

주로 Stack을 이용하여 구현되며, 코딩 테스트를 이용하여 구현할때는 재귀함수를 이용하여 구현하기도 한다.

주로 2차 행렬 넓이 구하기, 완전 탐색 문제 등에 자주 이용된다.

 

 

2. DFS 탐색 순서 이진 탐색을 이용한 DFS 탐색 순서 알아보기

사진 1. 이진 트리

 

이렇게 이진트리 하나가 있다고 하자. 그럼 DFS는 어떻게 탐색을 하는가?
위의 예시로 진행!

2.1. 1부터 시작할 것이기 때문에 1을 일단 push 한다. 그리고 탐색 한 자리는 탐색했다는
      마커 표시

사진 1-1. DFS 탐색 순서(1)

 

2.2. 1을 pop 한 후 1의 자식노드가 있으면 push한다

사진 1-2 DFS 탐색 순서(2)

 

2.3. 3 pop()하면서 방문체크, 이후 3의 자식이 있으면 자식들 push

사진 1-3 DFS 탐색 순서(3)

 

2.4. 3의 자식노드인 6,7 순서대로 push

사진 1-4. DFS 탐색 순서(4)

 

2.5. 7부터 자식 없으니 pop, 6 자식 없으니 pop

사진 1-5. DFS 탐색 순서(5)

 

2.6.  2 pop 이후 자식도느 push

사진 1-6. DFS 탐색 순서(6)

 

(마지막)2.7. 2의 자식노드 push

사진 1-7. DFS 탐색 순서(7)

 

이렇게 돌아간다. DFS 탐색을 이용하여 전위식 / 중위식/ 후위식을 표현하도록 만들 수 있다.

암튼 개념은 이렇고, 코드로 구현하는건 다음 글에서 진행하겠습니다.

 

웹 프로그래밍을 하려면 웹이 어떻게 동작하는지를 알아야한다.

 

 

목차

1. 개발도구 STS, Eclipse
2. 스프링 동작방식 - LifeCycle
3. Servlet / Container란?

 

1. 개발도구 STS, Eclipse

자바 프로그래밍 수업을 들을때 대부분 Eclipse를 사용한다. 그리고 웹 개발할때도 Eclipse를 사용할 수 있다. 그러면 이 둘의 차이는 무엇이고 둘 중 무엇을 선택해야하는가?

-> 회사에서 쓰는거 쓰면 됨ㅎ
Eclipse로는 필요한 패키지를 설치, 적용시키며 원하는 형태의 JAVA 프로그램을 만들 수 있다.
반면 STS는 JAVA 웹 개발에 최적화 되도록 만들어진 형태이다. Eclipse에서 제공하는 패키지, Spring에서 제공하는 패키지 둘 다 쓸 수 있음

Eclipse에서 웹 개발하려면 톰캣 설치하고 연동하는 환경 설정이 필요하지만, STS에서는 이런 환경설정이 기본으로 셋팅되어 있기때문에 따로 설정 안해주고 바로 개발을 시작할 수 있다. 
Eclipse Marketplace에서 STS 다운로드 후 사용 가능
따라서 둘 다 똑같음. 그냥 쓰고싶은거 쓰면 된다. 

 

2. Servlet / Container란?

하나의 이야기로 알아보자.

1.  자바를 이용해서 웹페이지를 만드려고 했다. 
2.  JSP 등장 => html파일이 java로 바꾸기 위해 jsp가 탄생
3.  완성된 jsp 파일을 이제 컴파일 해야함. 
4.  .java를 컴파일 하면 .class파일이 된다. 이 class파일들이 servlet이 된다.
5.  이렇게 jsp -> servlet으로 바꾸고,  servlet -> jsp로 바꾸어 주는것을 만듬
    이 과정들을 하나로 묶어논 것을 웹 컨테이너라고 부름 서블릿들을 묶어논것이니 서블릿 컨테이너 라고도함
6.  암튼 servlet(java 클래스)을 컴퓨터가 동작시키려면? -> 컴파일 해야함
7.  컴파일에 필요한것 = 컴파일러 - JDK 필요
그래서 WAS 설치할때 환경 변수에 JDK 컴파일러 경로를 써주는것이다.

8.  아파치 회사에서는 원래 WS(웹서버)를 통해 html로 정적 웹을 운영하는 웹서버를 가지고 있었다.
여기에다가 이렇게 개발된 웹 컨테이너를 합침 -> 웹 서버 + 웹 컨테이너 = Tomcat(톰캣) 탄생~

9. 이런것을 아파치사에서만 만든게 아니고 다른 회사에서도 만들었는데 암튼 이렇게 동작하는것들을 WAS(Web Application Server)라고 함. 그래서 WAS의 대표 종류중 하나를 Tomcat이라 한다.

따라서 웹 컨테이너는 아래 역할을 한다.
---------------------------------------------------------------------------------------------------
jsp 파일 -> 서블릿 변경 -> 서블릿 JDK로 컴파일 
서블릿 파일 -> jsp로 변경
=> html로 보이게 된 jsp 파일은 웹서버로 던져줌 = 웹 서버와 통신 기능
jsp 서블릿 관리함 
=> 서블릿의 생애주기 관리
요청이 오면 하나씩 생성하면 겁나 비효율적이겠져? -> 
요청할 때마다 쓰레드를 생성함
=> 멀티쓰레드 관리
프로그램이 메모리에 올라와서 동작하면 객체를 생성하고 끝내면서 동작한다.
그런데 뭘 생성하고 뭘 끝내는건가를 결정하는것을 XML 파일에 작성을 한다.
(XML 파일의 유래와 왜 사용되는지는 시간나면 정리)
그래서 프로그램이 동작하면 첫빠따로 보는것이 XML 파일보고 설명서대로 행동한다.
=> 선언적 보안관리(?)
---------------------------------------------------------------------------------------------------

첨부터 자바 파일(.class) 안에다 html썻으면 편했잖아 라고 하면 설명 길어짐
GooGle 검색창에 "JSP 탄생배경" 검색하면 우리 개발 고수님들이 깔끔하게 정리한 내용들이 많이 나옵니다!

암튼 그래서.

jsp파일을 java파일로 바뀌어진것을 서블릿 이라고 부른다.
그리고 이와 같이  프로그램이 동작할 수 있도록 환경을 하나로 묶어논 것들을 Container라고 부른다.

- 결론
Servlet : jsp파일을 Java 환경에서 실행시키기 위해 변경된 .java 파일
Container : (서블릿) 파일을 실행 시킬 수 있는 환경

객체를 생성하고 동작하고 다 사용하면 죽인다. 그래야 한정된 메모리 공간을 효율적으로 사용하는 것이다.
이것을 프로그램의 생애주기(Life Cycle)이라고 한다.

 

3. LifeCycle

스프링은 컨테이너에 Bean객체를 만들어 이것을 실행시키는 것이다. 이 라이프 사이클이 어떻게 돌아가는건지를 알아보도록 한다.
LifeCycle이 어떻게 돌아가는지 알아보도록 한다.
InitializingBean( 생성 ) -> servlet 객체 동작 -> DesposalBean( 종료 )

GenericXmlApplicationContext gxac = new GenericXmlApplicationContext("classpath:DispatchServlet.xml");

'WEB 개발 > Spring 개념' 카테고리의 다른 글

Spring - DB 연동방법  (0) 2019.04.24
MVC 패턴  (0) 2019.03.28
웹 서비스 과정 - Client - Server 구조  (0) 2019.03.28

Q. MVC 패턴이란?

A. Model / View / Controller 이렇게 3가지로 나누어 개발하는 소프트웨어 디자인 패턴입니다.

Model은 모델의 상태에 변화가 있을 때 컨트롤러와 뷰에 이를 통보합니다.

View는 사용자가 볼 수 있는 인터페이스 입니다.

Controller는 사용자의 요청에따라 어떤 동작을 해야할지 작성하는 부분 입니다.

이것 역시 검색하면 정리가 잘 된 내용이 많지만, 내가 이해하고 있는 방식대로 정리해보고자 한다.

 

목차

  •  Spring 동작 방식
        - 정적 과정(html) 흐름도
        - 동적 과정(JSP) 흐름도
        - MVC 동작 좀 더 자세한(?) 흐름도
        - 정리 : 전체 과정 흐름도

 

 

1. Spring 동작 방식

이전에 정리글 Tomcat -> Webapp폴더로 들어가면 이제 뭐가 어떻게 동작하는건가?

여기부터가 STS, Atom , Eclipse 등 다양한 개발 툴을 이용해서 어플리케이션을 개발하는 영역으로 들어온 것이다. (난 Spring FrameWork 공부중이니까 Spring 기준으로 작성할 것임)

간단하게 그림으로 살펴본다.

 

- 정적 과정(html) 흐름도

사진 1. html 요청 과정

서버에 요청이 들어오면 Dispatcher Servlet에서 해당 요청에 맞는 View(.html)를 보여준다.
(Dispatcher Servlet은 웹 컨테이너 내에서  실행되는 것)

 

- 동적 과정(JSP) 흐름도

사진 2. MVC 동작 과정

 

1. 서버에 요청이 들어오면 Dispatcher Servlet에서 요청 동작을 수행하기 위한 Controller로 전달한다.
2. 이후 컨트롤러에서 DB 내용이 필요하다면 Model에 요청하여 값을 받아오고 이것을 다시 Dispatcher Servlet으로 전달
3. Dispatcher Servlet은 처리가 완료된 결과가 작성된 View를 사용자에게 전달한다.

 

 

- MVC 동작 좀 더 자세한(?) 흐름도

 

사진 3. MVC 동작 자세히 보기

좀 더 자세히 보게되면, Dispatcher Servlet에는 HandlerMapping/ HandlerAdapter/ ViewResolver 라는 메서드가 작성되어 있다.

1. 서버에 요청이오면 Dispatcher Servlet내의  HandlerMapping 메서드가 동작하면서 해당 요청을 처리할 컨트롤러를 찾은 후 Dispatcher Servlet에게 알려준다.

2. 그 다음 선택 된 컨트롤러 중 어떤 메서드가 실행되야할지 HandlerAdapter가 찾아서 다시 Dispatcher Servlet에게 알려준다.

3. 그러면 Dispatcher Servlet은 HandlerMapping/ HandlerAdapter로 부터 전달받은 컨트롤러에게 일을 하라고 요청한다

.
4. 요청받은 컨트롤러는 필요한 데이터를 Model을 통해 데이터를 받아와서 다시 Dispatcher Servlet에게 전달한다.

5. 요청이 수행된 결과값을 적용할 View를 ViewResolver가 찾아서 적용을 시키고 다시 Dispatcher에게 전달

6. 마지막으로 Dispatcher servlet은 전달 받은 View를 사용자에게 전달 하면 완료!

 

 

 

 

 

정리 : 전체 과정 흐름도

사진 5. 웹 전체 동작 과정

 

그래서 Web을 이용할때 Client - Server에서 이루어지는 과정을 그림으로 보면 대략 이렇게 되는 것이다.

어쨋건 이렇기 때문에 톰캣 컨테이너가 무엇인지를 알아보았고, 우리가 개발하는 내용들이 어디에 위치되어 배포되는지까지 알아보았다. 아주아주 단순하고(?) 기본적인 내용이지만, 한번쯤 정리하고 싶었다.

'WEB 개발 > Spring 개념' 카테고리의 다른 글

Spring - DB 연동방법  (0) 2019.04.24
Servlet / Container란?  (0) 2019.03.31
웹 서비스 과정 - Client - Server 구조  (0) 2019.03.28

- 들어가기 -

웹 어플리케이션을 만들다 보니, 이것이 어떻게 통신하고 동작이 이루어지는지 서비스 과정이 궁금해졌다.

물론 깊게 들어가면 끝도없기 때문에 필요에 따라 하나씩 알아가기로 하고, 우선은 큰 그림만 이해하기로 한다.

 

목차

  • Client - Server 구조
  • Server에서 하는 일
  • Tomcat 구조

 

통신은 OSI 7 Layer 과정을 거쳐 통신을 한다. 각 계층의 통신에는 종류에 맞는 스펙이 존재한다. 그 중 웹 어플리케이션을 개발할때 필요한 개념을 정리할거니까 7 layer에서 7층에 있는 Application 계층(응용계층) 부분을 정리한다.

응용계층의 프로토콜에는 FTP, SSH , HTTP, SMTP ... 등이 있으며 목적에 따라 필요한 프로토콜을 사용한다.
나는 웹 어플리케이션 통신방식을 공부할거니까 저것 중 http 통신 방식을 사용하게 될 것이다.

(응용계층 프로토콜 정리 위키백과  - https://ko.wikipedia.org/wiki/%EC%9D%91%EC%9A%A9_%EA%B3%84%EC%B8%B5)

 

1. Client - Server 구조

Client가 Server에 요청을하면  Server는 요청 결과물을 Client에 응답.

(웹의 경우 클라이언트는 internet explorer, Chrome 등..)

웹 어플리케이션을 개발하게 되면 클라이언트는 http 프로토콜을 통해 필요한 정보를 주고 받을 것이다.

사진 1 Client - Server (CS) 구조

 

이것을 모르는 사람은 거의 없을 것이다.  Server는 어떤 개념인가?
그리고 Client가 서버에 요청을 하면 Server에서는 무엇을 할까?


서버는 단순하게 그냥 컴퓨터다. 솔직히 이걸 잘 몰랐다.(?) TV에서 가끔 보는 서버실 처럼 생긴게 서버인줄 알았다. 
내가 지금 사용하는 컴퓨터도 서버 컴퓨터가 될 수도 있다는 말인데, 컴퓨터에 관심없는 사람이었을땐 이 개념을 잘 몰랐다.


평소에는 나 혼자 내 컴퓨터를 쓰기때문에 많은 메모리가 필요하지 않다. 하지만 서비스를 하게되면 엄청나게 많은 사람들이 내 컴퓨터로 접속하게 될 것이고, 이 많은 요청을 처리하려면 성능 좋은 CPU와 메모리가 필요하게 될  것이다. 그래서 서비스 맞춤형의 고사양의 CPU와 메모리를 탑재한 서버용 컴퓨터를 만들게 된 것이고, 서버는 컴퓨터가 꺼져서 사용자들이 접속 못하면 큰일나기(?) 때문에 특별관리를 할 수 있도록 서버실에 컴퓨터를 몰아놓고 관리하는 것이다.

2.  Server에서 하는 일

서버를 구축하려면 물리적으로 어떤 사양으로 컴퓨터를 만들지 정하고, OS는 무엇으로 설치 할 것인지 정하고, 어떤 설치 파일이 필요하고 등등 할것이 정말 많지만, 웹/앱 초보 개발자가 손댈 부분은 아니기때문에 일단 패스

그래서 최대한 단순하게 정리한다.

사진 2. Server - tomcat 매핑

 

프로토콜에는 여러가지가 있고, 서버 내에서 웹 부분 요청(http)을 처리하는 웹서버를 설치하면 웹 서비스가 가능해진다.
웹서버의 종류에는 apache Tomcat, IIS , node js 등이 있으며 필요에 따라 선택하면 된다. 

Client는 "http://www.xxxx.com"과 같이 http 규격에 맞게 요청을 하면 서버는 이 요청에 맞게 웹서버로 요청을 보낸다. 그리고 필요한 정보를 찾아서 다시 클라이언트에게 보여준다.

더보기

여기서 궁금했던점이 있는데, 서버가 있는데 왜 또 웹서버를 설치해야 하는가? 에 관한 물음
http프로토콜 통신을 서버에서 직접적으로 관리할 수는 있으나 웹서버를 설치하고 실행해두면 서버는 http요청이 들어오면 웹서버로 던져주어 웹서버관련해서는 신경 안써도 되는것이다. 그러면 서버 메모리 사용에 있어서 훨씬 효율적으로 사용할 수 있기 때문에 웹서버를 설치하고 사용하는 것이다.

/* 포트는 서버에 접속할 때 서비스를 구분하려고 만든 번호 - 통신 영역 개념이기때문에 넘어감 */

 

그러면 Tomcat 폴더는 어떤 구조로 되어있으며 또 어떻게 동작을 할까?

3. Tomcat 구조

사진 3. 톰캣 폴더 구조

톰캣의 시작/종료/포트설정/연동 등등 설정을 담당하는 설정 폴더와 서비스 폴더 이렇게 두가지로 나누어지고 실제 서비스 되는 프로젝트 파일들은 webapps 내의 ROOT 폴더 밑에 놓인다.

사진 4. webapps 폴더 구조

webapps의 ROOT 폴더 아래에 STS / Eclipse 등으로 개발된 소스를 위치시키면 내가 개발한 어플이 서비스가 가능해지는 것이다. 클라이언트는 서버와 http로 통신하고, 클라이언트가 보게 되는 것은 ROOT폴더 내의 html/jsp파일인 것이다.

이렇게 서버 관리자들은 서버에 접속하는 Client의 요청들을 부하가 걸리지 않게 트래픽을 관리하고, 서비스가 원활하게 제공될 수 있는 환경을 연구하고 인프라를 구축 적용, 관리하는 역할을 하게 된다.

개발자들은 보통 ROOT 폴더 내에서 동작하는 어플리케이션을 개발하게 된다.

 

'WEB 개발 > Spring 개념' 카테고리의 다른 글

Spring - DB 연동방법  (0) 2019.04.24
Servlet / Container란?  (0) 2019.03.31
MVC 패턴  (0) 2019.03.28

[삽입 /선택 / 버블 정렬 구현하기]

JAVA로 구현했습니다.

가끔씩 까먹을 때 한번씩 찾아 보려구 작성했습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
package pracitce_note;
 
/* 실행시간이 n2인 정렬
 * 오름차순 기준 */
public class Sort {
    
    public void print_array(int[] answer) {
        for(int i : answer) {
            System.out.print(i+" ");
        }
        System.out.println();
        System.out.println();
    }
    
    public int[] insert_sort(int[] answer) {
        
        int temp;
        /* insert Array (삽입정렬)
         * i번째 값을 선택 , i값은 answer길이보다 커지면 스탑 
         * j번째 부터 n번째까지 비교
         * 
         * */
        
        for(int i=1; i<answer.length; i++) {
            temp = answer[i];
            for(int j=i-1; j>=0; j--) {
                if(temp < answer[j]) {
                    answer[j+1= answer[j];
                    answer[j] = temp;                    
                }
            }    
            System.out.println(i+"번째 회전 후");
            print_array(answer);
        }
        
        return answer;
        
    }
    
    public int[] slection_sort(int[] answer) {
        int min;
        int temp=0;
        
        /* Selection Sort (선택정렬 )
         * 1) min값을 찾는다 (min 선택)
         * 2) min값을  (i 번째와 바꾼다)
         * */
        
        for(int i=0; i<answer.length-1; i++) {
            min = i;
            for(int j=i+1; j<answer.length; j++) {
                
                if(answer[min]>answer[j]) {
                    min = j;
                }
            }
            temp = answer[i];
            answer[i] = answer[min];
            answer[min] = temp;
            
            System.out.println(i+1+"번째 회전 후");
            print_array(answer);
        }
        
        return answer;
    }
    
    public int[] bubble_sort(int[] answer) {
        
        int temp;
        
        /*
         * 서로 인접한 두 원소를 검사하여 정렬하는 알고리즘
         * j번과 j+1번을 비교해서 j가 더 크면 서로 자리 변경
         * 
         * */
        for(int i=0; i<answer.length-1; i++) {
            for(int j=0; j<answer.length-1-i; j++) {
                if(answer[j] > answer[j+1]) {
                    temp = answer[j];
                    answer[j] = answer[j+1];
                    answer[j+1= temp;
                }
            }
            System.out.println(i+1+"번째 회전 후");
            print_array(answer);
        }
        
        return answer;
    }
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        int[] answer = {4,1,5,3,2};//{2,1,4,3,5};
        
        Sort s= new Sort();
        
        System.out.println("초기 배열 : ");
        s.print_array(answer);
        
        s.insert_sort(answer);        
        //s.bubble_sort(answer);
        //s.slection_sort(answer);
        
        
    }
 
}
 
cs




+ Recent posts