728x90


jsp로 프론트 구현까지 하기 위해서 Dynamicc Web Project로 생성



config로  maven 추가

 Maven은 필요한 라이브러리를 특정 문서(pom.xml)에 정의해 놓으면 내가 사용할 라이브러리와 해당 라이브러리가 작동하는데에 필요한 다른 라이브러리들까지 관리하여 네트워크를 통해서 자동으로 다운받아 준다.

이후
webapp에는 프론트쪽 jsp 
src/main/java에는 백엔드쪽 java코드를 작성하면 된다.



'벡엔드' 카테고리의 다른 글

네이버 클라우드 CLOVA Chabot api 사용하기(자바)  (1) 2023.08.21
728x90

1부터 입력받은 숫자 n 사이에 있는 소수의 개수를 반환하는 함수, solution을 만들어 보세요.

https://school.programmers.co.kr/learn/courses/30/lessons/12921

프로그래머스에 있는 문제다.

 

소수의 정의는 자기 자신과 1을 제외한 다른 수로 나누어지지 않는 수이다.

초기에 생각한 방법은 루트값보다 작은 수로만 직접 나누어 보는 것이다.
루트값 이전까지 나누어지지 않았다면 이후의 값들 또한 나누어지지 않기 때문이다.

unction solution1(n) {
  let answer = 0;
  for (let i = 2; i <= n; i++) {
    // 미리 더함
    answer += 1;
    for (let j = 2; j * j <= i; j++) {
      if (i % j == 0) {
        //console.log(j);
        answer -= 1;
        break;
      }
    }
  }
  return answer;
}

다만 이렇게 풀면 런타임 에러가 뜬다.

 

이를 해결하기 위한 방법이 에라토스테네스의_체이다.

  1. 2부터 소수를 구하고자 하는 구간의 모든 수를 나열한다. 그림에서 회색 사각형으로 두른 수들이 여기에 해당한다.
  2. 2는 소수이므로 오른쪽에 2를 쓴다. (빨간색)
  3. 자기 자신을 제외한 2의 배수를 모두 지운다.
  4. 남아있는 수 가운데 3은 소수이므로 오른쪽에 3을 쓴다. 
  5. 자기 자신을 제외한 3의 배수를 모두 지운다.
  6. 남아있는 수 가운데 5는 소수이므로 오른쪽에 5를 쓴다. 
  7. 자기 자신을 제외한 5의 배수를 모두 지운다.
  8. 남아있는 수 가운데 7은 소수이므로 오른쪽에 7을 쓴다. 
  9. 자기 자신을 제외한 7의 배수를 모두 지운다.
  10. 위의 과정을 반복하면 구하는 구간의 모든 소수가 남는다. 

소수인 값들을 제외한 모든 수를 지우면서 진행하는 것이다.

 

https://ko.wikipedia.org/wiki/%EC%97%90%EB%9D%BC%ED%86%A0%EC%8A%A4%ED%85%8C%EB%84%A4%EC%8A%A4%EC%9D%98_%EC%B2%B4

 

에라토스테네스의 체 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 수학에서 에라토스테네스의 체는 소수를 찾는 방법이다. 고대 그리스 수학자 에라토스테네스가 발견하였다. 알고리즘[편집] 2부터 소수를 구하고자 하는 구간

ko.wikipedia.org

 

이를 알고리즘으로 표현하면 아래와 같다.

function solution(nums) {
  const prime = new Array(nums + 1).fill(1);
  let count = nums - 1;
  for (let i = 2; i < Math.sqrt(nums); i++) {
    if (prime[i]) {

      for (let j = i ** 2; j <= nums; j += i) {
        if (prime[j]) count--, (prime[j] = 0);
      }
    }
  }
  console.log(count);
  return count;
}

우선 배열을 만들어서 값을 다 집어넣는다. (1에서 nums까지의 소수의 개수를 판별하는 문제임)
인덱스는 0부터 시작하기 떄문에 배열은 nums+1개로 만들고 fill함수를 통해서 전부다 1로 채워준다.

그리고 해당수의 제곱근보다 작은 수들에 대해서 확인을 한다.

배열에 있는 인덱스 값이 0이면 소수가 아니고, 1이면 최종적으로 소수이다. 하지만 1은 소수가 아니므로 count에서 미리 한 개를 뺀다.


예를 들어 10의 경우에는 i는 2부터 3까지만 실행된다 ( 10의 제곱근이 3.xxxx 이므로 )

 

이후 j를 통해서 i값의 제곱들만 거르기 시작한다. (이후 더 작은 j 값에서 자기보다 작은 값을 곱한 값을 걸렀기 때문이다.)
이후  i의 2배 3배 4배 형식으로 값을 확인하기 때문에 for문의 조건은 j+=i이다 

즉 i를 통해서 소수를 찾고 j를 통해서 해당 소수의 배수를 거르는 작업이다.

i가 2일때는 j에서 4를 거르고 이후 6 8 10을 걸러준다. ( 배열의 값을 0으로 만듬)
이후 3일 때는 9를 걸러준다. 
 최종적으로 배열이 11110101000 이 된다.  ( 0123 5 7의 값만 1이됨 )
이때 count는 거르는 작업에서 뺴줬기 떄문에 9개에서 5개를 뺸 4개가 되고. 1의 개수보단  배열의 2개가 적다(0과 1을 뺌)


728x90

 

코드 : https://github.com/suhong99/jspLecture/tree/master/SampleModelOne

 

GitHub - suhong99/jspLecture

Contribute to suhong99/jspLecture development by creating an account on GitHub.

github.com

1. eclipse에서  Dynamic Web Project로 파일을 만든다.

이후 \주소\내프로젝트 이름\src\main\webapp\WEB-INF\lib에  mysql-connector-j-8.0.33.jar파일 넣으면 초기세팅이 끝난다.

 

2. 신세계에서 배우는 프로젝트에선 db, jsp , bootstrap, jquery를 이용해서 만들었다.

 

3. db는 MYSQL을 사용했는데, 

create table member(
	id varchar(50) primary key,
	pwd varchar(50) not null,
	name varchar(50) not null,
	email varchar(50) unique,
	auth int
);

select count(*)
from member
where id='abc';

select * from member;

delete from member
where id='abc';

회원가입은 다음과 같다.  아이디와 비밀번호  email name을 입력받는다.
auth는 추후 관리자 관련 값이다. 관리자는 1 회원은 3
이를 eclipse에서 만든 java코드를 통해서 db에 값을 추가해준다.

프론트쪽에서 값을 입력하기 전에 db와 연결할 java코드를 먼저 작성한다.


3. 데이터에 접근할 때는 dto와 dao를 사용한다.
dto 는 Data Transfer Object로 데이터로 주로 db와 주고 받은 값을 담는데 사용한ㄷ.
 dao는 데이터 베이스에 접근하기 위한 객체 Data Access Object이다.


4. dao에는instance생성, 생성자 , 아이디 확인, 로그인 , 회원가입이 있다. 

 

public boolean addMember(MemberDto dto) {		
		String sql = " 	insert into member(id, pwd, name, email, auth) "
				+ "		values(?, ?, ?, ?, 3) ";
		
		Connection conn = null;
		PreparedStatement psmt = null;
		
		int count = 0;
		
		try {
			conn = DBConnection.getConnection();
			System.out.println("addMember 1/3 success");
				
			psmt = conn.prepareStatement(sql);
			psmt.setString(1, dto.getId());
			psmt.setString(2, dto.getPwd());
			psmt.setString(3, dto.getName());
			psmt.setString(4, dto.getEmail());
			System.out.println("addMember 2/3 success");
			
			count = psmt.executeUpdate();
			System.out.println("addMember 3/3 success");
			
		} catch (SQLException e) {
			System.out.println("addMember fail");
			e.printStackTrace();
		} finally {
			DBClose.close(psmt, conn, null);
		}
		
		return count>0?true:false;
	}

 

위의 코드는 구중에 회원가입에 관련된 코드다. 

위와 같이 db와 dao dto가 준비가 끝나면 이제 프론트쪽 코드를 작성하면 된다.

회원가입 코드는 아래와 같다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원가입</title>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.4/jquery.min.js"></script>

<style type="text/css">
.center{
	margin: auto;
	width: 60%;
	border: 3px solid #0000ff;
	padding: 10px;
}
</style>

</head>
<body>

<h2>회원가입</h2>
<p>환영합니다</p>

<div class="center">

<form action="regiAf.jsp" method="post">

<table border="1">
<tr>
	<th>아이디</th>
	<td>
		<input type="text" name="id" id="id" size="20" placeholder="아이디">
		<input type="button" id="id_chk_btn" value="id확인"><br>
		<p id="idcheck" style="font-size: 8px"></p>		
	</td>
</tr>
<tr>
	<th>패스워드</th>
	<td>
		<input type="text" name="pwd" id="pwd" size="20">
	</td>
</tr>
<tr>
	<th>이름</th>
	<td>
		<input type="text" name="name" size="20">
	</td>
</tr>
<tr>
	<th>이메일</th>
	<td>
		<input type="text" name="email" size="20">
	</td>
</tr>
<tr>
	<td colspan="2" align="center">
		<input type="submit" value="회원가입">
	</td>
</tr>
</table>

</form>
</div>

<script type="text/javascript">
$(document).ready(function(){
	
	$("#id_chk_btn").click(function(){
		
		// id의 규칙: 대소문자 + 특수문자 포함
		
		// id 글자의 갯수
		
		// id가 사용할 수있는지 없는지 -ajax
		$.ajax({
			url:"idcheck.jsp",
			type:"post",
			data:{ "id":$("#id").val() },
			success:function( answer ){
				// alert("success");
				// alert(answer);
				
				if(answer.trim() == "YES"){
					$("#idcheck").css("color", "#0000ff");
					$("#idcheck").text("사용할 수 있는 아이디입니다");
				}else{
					$("#idcheck").css("color", "#ff0000");
					$("#idcheck").text("사용중인 아이디입니다");
					$("#id").val("");
				}
				
			},
			error:function(){
				alert('error');
			}
		});
	});
	
});
</script>




</body>
</html>

간단하게 id가 이미 존재하는지 확인하고,  만약 존재하지 않는다면 회원가입을 진행하면 된다.

이때 idcheck.jsp에서 아이디를 확인하고 있는데 

<%@page import="dao.MemberDao"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	String id = request.getParameter("id");

	MemberDao dao = MemberDao.getInstance();
	boolean b = dao.getId(id);
	if(b == true){	// id가 있음
		out.println("NO");
	}else{	// id가 없음(사용할 수 있음)
		out.println("YES");
	}	
%>

jsp에서는 <% %> 사이에 자바코를 작성하고, dao 인스턴스를 생성한 후, dao에 있는 id 확인 함수를 실행한다.

	public boolean getId(String id) {
		String sql = " 	select count(*) "
				+ "		from member "
				+ "		where id=? ";
		
		Connection conn = null;
		PreparedStatement psmt = null;
		ResultSet rs = null;
		
		int count = 0;
		
		try {
			conn = DBConnection.getConnection();
			System.out.println("getId 1/4 success");
		
			psmt = conn.prepareStatement(sql);
			psmt.setString(1, id);
			System.out.println("getId 2/4 success");
			
			rs = psmt.executeQuery();
			System.out.println("getId 3/4 success");
			
			if(rs.next()) {
				count = rs.getInt(1);				
			}	
			System.out.println("getId 4/4 success");
			
		} catch (SQLException e) {		
			System.out.println("getId fail");
			e.printStackTrace();
		} finally {
			DBClose.close(psmt, conn, rs);
		}
		
		return count>0?true:false;
	}

sql의 where문을 통해 아이디를 확인하고 있따면 count를 올려서 true값이 반환되게 한다.

그리고 따라서 위의 regi.jsp에서 true일 때 아이디가 중복됩니다라고 알려준다.

이후 중복되지 않는다면

<%@page import="dto.MemberDto"%>
<%@page import="dao.MemberDao"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<%
	request.setCharacterEncoding("utf-8");

	String id = request.getParameter("id");
	String pwd = request.getParameter("pwd");
	String name = request.getParameter("name");
	String email = request.getParameter("email");
	
	MemberDao dao = MemberDao.getInstance();
	
	MemberDto dto = new MemberDto(id, pwd, name, email, 0);
	boolean isS = dao.addMember(dto);
	if(isS == true){	// 가입성공!	
		%>
		<script type="text/javascript">
		alert("가입에 성공하셨습니다!");
		location.href = "login.jsp";
		</script>
		<%
	}else{				// 가입실패
		%>
		<script type="text/javascript">
		alert("다시 가입해 주십시오");
		location.href = "regi.jsp";
		</script>
		<%
	}
%>

가입 성공을 시키면 된다.

728x90

 보통 개발을 처음 배우기 시작하면서 Git 을 배우게 된다.

깃을 처음 배울 때, 가장 자주 보는 그림은 아래와 같은 것일 거다.

실제로 깃을 내가 배우고 나서도, 이력서를 쓸 때 버전 관리를  날짜로 하였다. 

그러다가 깃을 어떠한 경우에 활용하면 효율적인가에 대해서 배울 기회가 생겨서 이렇게 공유하게 되었다.

 

깃을 사용할 때는 크게 5가지의 시나리오가 있다.

 

1. 혼자 작업을 할 때 한 컴퓨터에서 버전 관리.

이력서를 쓸 때, 이력서를 계속 보완하게 될 것이다. 그러다보면 수정한 것보다 전 버전이 마음에 든 경우도 있을 수 있다. 모든 버전을 저장한다고 생각해보자. 이 경우 어떤 이력서가 최신 것인지 구별하기도 어렵고 , 파일도 너무 많아질 것이다.

이를 관리하기 위해서 깃을 사용하면 좋다.

git init 명령어를 통해서 해당 폴더를 깃으로 관리하게 되는 경우, 커밋 내역을 통해서 내가 어떻게 수정했는지 확인도 가능하고, 원하는 버전으로 롤백 또한 가능하다. (굳이 여러 파일로 나누지 않더라도)

 

 

2. 혼자 작업을 하는데, 다른 컴퓨터에서 사용할 경우

 발표 자료를 준비했다고 생각해보자. 보통 우리는 클라우드 혹은 usb에 해당 파일을 저장한다. 하지만 git push 기능을 통해서 git hub에 파일을 저장해 놓은 경우에는 굳이 클라우드 혹은 usb를 사용하지 않더라도 해당 파일을 사용할 수 있다.

이때 사용되는 기능이 저장소에 저장하는 git push 와 저장소를 복제하는 git clone 이다.

 

 

3.   혼자 작업을 하지만, 다른 컴퓨터에서도 작업할 경우

 git push를 통해서 내가 현재 작업한 내용을 원격 저장소에 백업을 해놓았지만, 이 내용이 원격 저장소에서는 같지만 내 컴퓨터와 회사 컴퓨터에서는 다를 수가 있다.

이를 해결할 수 있는 것이 git pull 이다. 원격 저장소에 저장된 내용을 바탕으로 내 컴퓨터에 저장된 내용을 최신화 하는 과정이다.  이 과정에서 실수로  내 컴퓨터를 최신화하지 않고 작업을 한다면, 회사에서 작업한 내용과 내가 작업한 내용이 겹칠 수가 있다. 이를 충돌이라고 하는데, git 을 통해서는 해당 충돌 내용을 비교해서 내가 필요한 내용을 취합 할 수 있다.

충돌의 경우는 결국 추가 작업이기 때문에 git에서는 pull을 먼저해야지만 내 내용을 push할 수 있도록 되어 있고, 가급적이면 작업전에 pull을 먼저 하는게 좋다.

 

 

4. 혼자 작업을 하지만, 공통된 부분 말고 따로 관리하고 싶을 때

이력서를 쓴다고 생각해보자. 모든 회사에 같은 이력서를 제출할 수는 없다. 이때 사용할 수 있는 기능이 git branch이다.

개인 신상과 같이 공통된 내용은 최상단 브랜치에서 관리를 하고,  브랜치 기능을 통해서 각각의 회사별 이력서를 관리할 수 있다.

 

5. 여러 명에서 같은 파일을 통해 작업을 하는 경우

여러 명에서 같은 파일을 통해 작업을 한다고 생각을 해보자. 매번 충돌이 일어날 것이다. 이를 매번 해결하는 과정도 복잡하고, 사람 수가 늘수록 작업에 큰 지장을 줄 것이다. (pull을 했는데, 바로 다음 사람이 push한 경우 또 pull을 해야한다

 

이를 해결할 수 있는 방법이 git branch이다.

각각의 브랜치에서 작업을 하는 경우, 매번 pull을 할 필요 없고 최종적으로 내 작업이 끝날 때만 git merge를 하면 된다.

git merge는 가지처럼 뻣어나간 각각의 branch에서 작업한 내용을 합치는 기능이다.

 

이러한 깃의 활용도가 늘어나면 git branch 전략을 사용하여서, 배포할 웹 혹은 앱의 현재버전, 배포준비 버전, 핫픽스 버전, 개발 버전 등등 나뉘어서 작업할 수 있다.

 

+ Recent posts