본문 바로가기

회고록(TIL&WIL)

TIL 2023.02.16 Java Web 6 (maven, Junit, CP)

maven

프로젝트 생성

e:/workspace/:
mvn archetype:generate ^
    -DarchetypeGroupId=org.apache.maven.archetypes ^
    -DarchetypeArtifactId=maven-archetype-webapp ^
    -DgroupId=com.bit ^
    -DartifactId=day50

프로젝트 import

최초 import 후 eclipse 에선 servlet이 없다고 오류가 발생하지만 servlet은 tomcat에 있고
실행 시 tomcat을 통해 실행하기 때문에 실제 실행상의 문제는 없다.
배포환경에선 상관없지만 개발환경에 있어선 상속을 받아와서 쓴다던가 할 수 가 없다.

해결 1 build path에 servlet을 올려두기.

tomcat 올려버리기

이 방법 프로젝트을 옮겨 받을 때 마다 build path를 지정해줘야 하기 때문에 사용되지 않는다.

 

해결 2 pom.xml dependency 추가하기

다양한 servlet이 많지만 모든 WAS컨테이너를 받기 위해서 java servlet api로 라이브러리 추가
일반적인 라이브러리의 경우는 war에 추가되는데 scope 태그를 이용해서 포함되지않도록 설정해야 한다.

  

    javax.servlet
    javax.servlet-api
    3.1.0
    provided

web.xml 수정




  Archetype Created Web Application

Project update

module을 바꿔주고 싶은데 되지않는다.

해당 프로젝트의 .settings 폴더를 찾아가서 세팅이 되어있는 xml파일을 열어서 수정한다.

jst.web 을 3.0으로 바꾼다.

project를 update 해준 뒤 바뀐 것을 확인

SPA Web

SPA로 페이지를 제작 시 히스토리가 쌓이지 않는 단점이 존재하는데
이를 극복하기 위해서 페이지 이동 시 url에 #(id값)을 포함되도록해서 히스토리를 쌓을 수 있다. a태그를 눌리게 되면 해당하는 id를 가지고 있는 곳으로 이동된다.

<a href="#list">list</a>
<br><br>...
<div class="content" id="list">

junit test

테스트 파일은 war에 포함되지 않으며 빌드 될 때 테스트가 성공해야만 빌드가 완료된다.

테스트 파일 생성

 

테스트 파일 작성

public class DeptDaoTest {
	@Test
	public void testSelectAll() throws SQLException, ClassNotFoundException {
		DeptDao dao = new DeptDao();
		// mysql Connection
		Class.forName(Driver.class.getCanonicalName());
		String url = "jdbc:mysql://localhost:3306/lecture";
		String user = System.getenv("MYSQL_USER");
		String password = System.getenv("MYSQL_PW");
		dao.conn = DriverManager.getConnection(url,user,password);
		// dao test
		List<DeptDto> list = dao.selectAll();
		assertNotNull(list);
		assertTrue(list.size()>0);
	}
}

테스트 결과

성공

실패 - mysql 패스워드 틀림

assertion Error

assertNotNull

 asserTrue

cmd에서도 테스트 가능

mvn test

ConnectionPool

 DB에 미리 연결해서 Connection 미리 가지고 있고 요청이 올 때마다 커넥션 객체들을 주고 반환 받고만 하기 때문에
동시접속 처리도 되고 DB를 연결했다 끊었다 하지 않기 때문에 자원소모도 적다.
처음 시작할 때 몇개의 커넥션을 물려놓고 대기시키는 것이 필요. 적은 수의 커넥션만 물려놓다가
요청에 따라 커넥션을 늘리기도 하고 줄이기도 할 수 있다. 테스트는 tomcat을 거치지 않기 때문에 ConnectionPool 을 사용할 수 없고 따로 커넥션을 해줘야만한다

프로젝트 Server에 Context.xml 의 맨아래에 아래 코드 붙여넣기

tomcat jdbc CP Document maxIdle : 최대 유지되는 커넥션 수 (해당 수 이상의 커넥션들은 반환 받지 않고 폐기함) minIdle : 최초 생성 커넥션 수 maxActive: 최대 동시 사용되는 커넥션 수 maxWait : 최대 대기 시간 (-1을 주면 무한대기) defaultAutoCommit="false" 를 주게 되면 DAO에서 conn.commit(), conn.rollback()을 이용해야한다.

<Resource name="jdbc/TestDB" 
	auth="Container" 
	type="javax.sql.DataSource" 
	maxActive="100" 
 	maxIdle="30" 
 	maxWait="10000" 
	username="scott" 
 	password="tiger" 
	driverClassName="com.mysql.jdbc.Driver" 
	url="jdbc:mysql://localhost:3306/lecture"/>

프로젝트의 WEB-INF/web.xml에 아래 코드 붙여 넣기

<resource-ref>
      <description>DB Connection</description>
      <res-ref-name>jdbc/TestDB</res-ref-name>
      <res-type>javax.sql.DataSource</res-type>
      <res-auth>Container</res-auth>
  </resource-ref>

커넥션이 필요한 DAO 파일의 생성자로 구현

Connection conn;
public DeptDao() throws NamingException, SQLException {
	Context initContext = new InitialContext();
	Context envContext  = (Context)initContext.lookup("java:/comp/env");
	DataSource ds = (DataSource)envContext.lookup("jdbc/TestDB");
	conn = ds.getConnection();
}

Web

CORS 관련 header 세팅

Controller

resp.setHeader("Access-Control-Allow-Origin", "http://127.0.0.1:5500"); // * 를 주면 전체 공개
resp.setHeader("Access-Contorl-Aloow-Methods", "GET"); // Method를 Get만 받도록 제한

SPA 뒤로가기 되도록

창이 변경될 때 onpopstate
location.href으로 url에 적혀있는 #XXX을 파악해서 페이지가 적용되도록

$(function(){
	var p1 = $('#p1').html();
	var p2 = $('#p2').html();
	var p3 = $('#p3').html();
	var p4 = $('#p4').html();
	$('#p1,#p2,#p3,#p4').hide();
	$(window).on('popstate', function(e){
		if(location.href.endsWith('/#index') 
				|| location.href.endsWith('/')){
			$('.content').html(p1);
		}
		if(location.href.endsWith('/#intro')){
			$('.content').html(p2);
		}
		if(location.href.endsWith('/#list')){
			$('.content').html(p3);
			getList();
		}
	});
});