안녕하세요 프로그래밍 맛보기 3부로 왔습니다.

1부에서는 프로그래밍의 Basic 개념에 대해 다루었었습니다

2부에서는 객체 지향 프로그래밍에서 중요한 개념인 Class에 대해 배웠었습니다

그리고 이번 3부에서는 우리가 공부한 것들을 바탕으로 서비스 단위 개발을 맛보기로 해볼까 합니다

 

2부에 작성했던 업무모델 로직을 바탕으로 진행하겠습니다.

여기에 서비스 화면UI, 서비스 처리 로직을 조금 더하여 만들어보겠습니다.

 

이번에도 메모장을 열어 다음 코드를 함께 작성하시겠습니다.

<script type="text/javascript">
//----- 서비스에 사용될 Data들 ---------------------------------------------------------------------------------------------------
var employees = [ //시스템에 등록된 사원목록
	{ 
		employee_id: '12345',
		name: '소영희', 
		position: '대리', 
		working_months: 36,
		salary: 4000
	}, 
	{ 
		employee_id: '67890',
		name: '장경식', 
		position: '과장', 
		working_months: 52,
		salary: 5300
	}, 
	{ 
		employee_id: '14703',
		name: '정명준', 
		position: '차장', 
		working_months: 85,
		salary: 6000
	}
];
var tasks = [ //시스템에 등재된 업무목록
	{  
		task_id: '54321',
		task: 'xx프로젝트 팀원',
		working_hours: 42,
		person_in_charge: '67890'
	}, 
	{  
		task_id: '09876',
		task: 'xx프로젝트 영업지원',
		working_hours: 57,
		person_in_charge: '12345'
	}
];
</script>
<!----- 서비스 화면UI ------------------------------------------------------------------------------------------------------->
<div class="data">
	<div class="dataTitle" >
		<b>[ㅇㅇ모직 직원목록]</b>
	</div>
	<table cellpadding="0" cellspacing="0" style="text-align:center;">
		<thead>
			<tr>
				<th></th><th>사번</th><th>이름</th><th>직위</th><th>근무개월수</th><th>연봉</th><th>담당업무명</th><th>공수</th>
			</tr>
		</thead>
		<tbody>
			<tr>
				<td colspan="8">결과를 조회 중입니다</td>
			</tr><!--
			<tr>
				<td>b</td><td>b</td><td>b</td><td>b</td><td>b</td><td>b</td><td>b</td>
			</tr>
			<tr>
				<td>c</td><td>c</td><td>c</td><td>c</td><td>c</td><td>c</td><td>c</td>
			</tr>
			<tr>
				<td>d</td><td>d</td><td>d</td><td>d</td><td>d</td><td>d</td><td>d</td>
			</tr>-->
		</tbody>
	</table>
	<div>
		<button onclick="hrd.showEmployeeInfoModal('add')" >등록</button>
		<button onclick="hrd.showEmployeeInfoModal('modify')" >수정</button>
		<button onclick="hrd.deleteEmployeeInfoById()" >삭제</button>
	</div>
</div>

	<!-- The Modal -->
	<div id="myModal" class="fade-bg">
	  <!-- Modal content -->
	  <div class="modal-content">
	    <div class="close" style="float:right">&times;</div>
	    <p id="modalTitle1" class="modalTitle" style="float:left;"><b>사원 등록/수정</b></p>
	    <form><!-- serialize  -->
	    <table>
	    	<tr>
	    		<th width="30"></th><th width="100"></th><th></th>
	    	</tr>
	    	<tr>
	    		<td></td>
	    		<td>사번</td><td><input type="text" name="employee_id"></td>
	    	</tr>
	    	<tr>
	    		<td></td>
	    		<td>이름</td><td><input type="text" name="name"></td>
	    	</tr>
	    	<tr>
	    		<td></td>
	    		<td>직위</td><td><input type="text" name="position"></td>
	    	</tr>
	    	<tr>
	    		<td></td>
	    		<td>근무개월수</td><td><input type="text" name="working_months"></td>
	    	</tr>
	    	<tr>
	    		<td></td>
	    		<td>연봉</td><td><input type="text" name="salary"></td>
	    	</tr>
	    	<tr>
	    		<td></td>
	    		<td colspan="2">
	    			<button type="button" id="modalBtn" onclick="" >등록</button>
	    			<button type="button" onclick="showModal('N')" >취소</button>
	    		</td>
	    	</tr>
	    </table> 
	   	</form>
	  </div>
	</div>

	<!-- The Loader -->
	<div id="myLoader" class="fade-bg">
	  <div class="loader"></div>
	</div>

<style type="text/css">

button { float:left;width:150;padding:10 10;margin:30 20; }

.data { padding:30 100;width:600 } 
.dataTitle { font-size:15pt;padding:20 0; }

div.data table { text-align:center;width:850; }
div.data table th { padding:10 15;background-color:black;color:white; } 
div.data table td { padding:10 15; }
div.data tr:nth-child(n) td { background-color:lightgrey;border-bottom:1px solid grey; }

.modalTitle { font-size:15pt;padding-left:20; } 

div.modal-content table  { clear:both;padding-top: 15; }
div.modal-content table th {} 
div.modal-content table td { padding:5; }
div.modal-content tr:nth-child(n) td {}

/* The Modal (background) */
.fade-bg {
  display: none; /* Hidden by default */
  position: fixed; /* Stay in place */
  z-index: 1; /* Sit on top */
  left: 0;
  top: 0;
  width: 100%; /* Full width */
  height: 100%; /* Full height */
  overflow: auto; /* Enable scroll if needed */
  background-color: rgb(0,0,0); /* Fallback color */
  background-color: rgba(0,0,0,0.4); /* Black w/ opacity */
}
/* Modal Content/Box */
.modal-content {
  background-color: #fefefe;
  margin: 5% 15%; /* 15% from the top, to center use auto */
  padding: 20px;
  border: 1px solid #888;
  width: 470px; /* Could be more or less, depending on screen size */
}
/* The Close Button */
.close {
  color: #aaa;
  float: right;
  font-size: 28px;
  font-weight: bold;
}
.close:hover,
.close:focus {
  color: black;
  text-decoration: none;
  cursor: pointer;
}

/* Loader */
.loader {
  border: 16px solid #f3f3f3; /* Light grey */
  border-top: 16px solid #3498db; /* Blue */
  border-radius: 50%;
  width: 80px; height: 80px;
  animation: spin 2s linear infinite;
  margin: 180 480;
}
@keyframes spin {
  0% { transform: rotate(0deg); }
  100% { transform: rotate(360deg); }
}
//Loader 소스 출처. w3schools https://www.w3schools.com/howto/howto_css_loader.asp
</style>
<script type="text/javascript">
try {
//----- 서비스 처리 로직 ---------------------------------------------------------------------------------------------------------
window.onload = function() {
console.log("onload-start:"+ (performance.now()/1000).toFixed(5) +" sec"); //수행시간 측정 시작

hrd.loadDataToTable();

console.log("onload-ended:"+ (performance.now()/1000).toFixed(5) +" sec"); //수행시간 측정 종료 
}
//employees.length = [];
var table = document.getElementsByTagName("table")[0];
var buttons = document.getElementsByTagName("button");
var hrd = {

//----- 추가된 기능 --------------------------------------------------------------------------------------------------------------

	loadDataToTable: function() {
		table.getElementsByTagName("tbody")[0].innerHTML="";
		if(employees.length>0) {
		  for(var i=0; i<employees.length; i++) { 
		  	var row = "<tr>"
		  			  +"<td>"+"<input type='checkbox' value='"+employees[i].employee_id+"'>"+"</td>"
					  +"<td>"+employees[i].employee_id+"</td>"
					  +"<td>"+getMaskedName(employees[i].name)+"</td>"
					  +"<td>"+employees[i].position+"</td>"
					  +"<td>"+employees[i].working_months+"</td>"
					  +"<td>"+employees[i].salary+"</td>"
			var hastask = false;
		  	for(var j=0; j<tasks.length; j++) { 
			  if (employees[i].employee_id == tasks[j].person_in_charge) {
			  	hastask = true;
				row+= "<td>"+tasks[j].task+"</td>"
					 +"<td>"+tasks[j].working_hours+"</td>"; 
			  } 
			}
			if(!hastask) row+= "<td>"+"업무 미배정"+"</td>"+"<td>"+"</td>";
			row+= "<tr>";
		    table.getElementsByTagName("tbody")[0].innerHTML+=row;
		  }
		} else { 
			table.getElementsByTagName("tbody")[0].innerHTML+= 
				"<tr><td colspan='8'>등록된 직원이 없습니다</td></tr>";
			for(var i=0; i<buttons.length ; i++) { 
				buttons[i].disabled = true;
			}
			
		}
	},

	verifyEmployeeInfoById: function(emp_id){ 
		var targetEmployee = this.getEmployeeInfoById(emp_id);
		if(targetEmployee=="not registered") {
			return "등록되지 않은 사번입니다";
		} 
		else {
			return targetEmployee;
		}
	},

	showEmployeeInfoModal: function(command){
		var modalBtn = document.getElementById("modalBtn");
		if(command == "add") {
			showModal("Y");
			modalTitle1.innerHTML = "<b>사원정보 등록</b>";
			modalBtn.innerHTML = "등록";
			modalBtn.onclick = function() { hrd.addEmployeeInfo(''); };
		}
		else if(command == "modify") {
			alert("수정 기능 준비중입니다");

			//showModal("Y");
			//modalTitle1.innerHTML = "<b>사원정보 수정</b>";
			//modalBtn.innerHTML = "수정";
			//modalBtn.onclick = function() { hrd.modifyEmployeeInfoById(''); };
		}
	},

	addEmployeeInfo: function(emp_id){
		var employee = this.setValidEmployee();
		if(employee == "notValid") return;
		console.log("hrd.addEmployeeInfo-start:" + (performance.now()/1000).toFixed(2) +" sec"); //수행시간 측정 시작

		var thisclass = this;
		showLoader("Y");
		setTimeout(function() {
		  employees.push(employee);
		  thisclass.loadDataToTable();
		  showLoader("N");
		  thisclass.afterTask("사원정보를 성공적으로 등록하였습니다");

		console.log("hrd.addEmployeeInfo-ended:"+ (performance.now()/1000).toFixed(2) +" sec"); //수행시간 측정 종료
		}, 1200);
	},

	//숙제. 수정 기능을 구현해보세요
	modifyEmployeeInfoById: function(emp_id){
		alert("수정 기능 준비중입니다");
		this.afterTask("사원정보를 성공적으로 수정하였습니다");
	},

	setValidEmployee() {
		var employee_id = document.querySelector("input[name=employee_id]");
		var name = document.querySelector("input[name=name]");
		var position = document.querySelector("input[name=position]");
		var working_months = document.querySelector("input[name=working_months]");
		var salary = document.querySelector("input[name=salary]");

		//serialize 
		var form = document.getElementsByTagName("form")[0]; var data = new FormData(form); 
		var dataObj = {}; for(let entry of data){ dataObj[entry[0]]=entry[1]; } var jsonData = JSON.stringify(dataObj); var jsonObj = JSON.parse(jsonData);
		var params = new URLSearchParams(data).toString();
		//var req = new XMLHttpRequest(); req.send(data); //send post request

		var employee_id_val = employee_id.value; //jsonObj.employee_id; 
		var name_val = name.value; 
		var position_val = position.value; 
		var working_months_val = working_months.value; 
		var salary_val = salary.value; 

		var regex = /^[ㄱ-ㅎ|가-힣|a-z|A-Z|]+$/;
		if(employee_id_val=="") { 
			alert("사원번호를 입력하지 않았습니다"); employee_id.focus(); return "notValid"; }
		else if(isNaN(employee_id_val)) { 
			alert("사원번호는 숫자만 사용가능합니다"); employee_id.focus(); return "notValid"; }

		if(name_val=="") { 
			alert("이름을 입력하지 않았습니다"); name.focus(); return "notValid"; }
		else if(!regex.test(name_val)) { 
			alert("이름은 문자만 사용가능합니다"); name.focus(); return "notValid"; }

		if(position_val=="") { 
			alert("직급을 입력하지 않았습니다"); position.focus(); return "notValid"; }
		else if(!regex.test(position_val)) { 
			alert("직급은 문자만 사용가능합니다"); position.focus(); return "notValid"; }

		if(working_months_val=="") { 
			alert("근무개월수를 입력하지 않았습니다"); working_months.focus(); return "notValid"; }
		else if(isNaN(working_months_val)) { 
			alert("근무개월수는 숫자만 입력 가능합니다"); working_months.focus(); return "notValid"; }

		if(salary_val=="") { 
			alert("연봉을 입력하지 않았습니다"); salary.focus(); return "notValid"; }
		else if(isNaN(salary_val)) { 
			alert("연봉은 숫자만 입력 가능합니다"); salary.focus(); return "notValid"; }

		var employee = new Object();
		employee.employee_id = employee_id_val;
		employee.name = name_val;
		employee.position = position_val;
		employee.working_months = working_months_val;
		employee.salary = salary_val;

		return employee;
	},

	afterTask(message) {
		alert(message);
		showModal("N");
	},

	deleteEmployeeInfoById: function(emp_id){
		var target = "";
		if(emp_id==null) target = document.querySelectorAll('input[type="checkbox"]:checked');
		else target = emp_id;
		for(var i=0; i<target.length; i++) {
		  	var verifyResult = ( emp_id==null ? this.verifyEmployeeInfoById(target[i].value) : this.verifyEmployeeInfoById(target) );
			if(verifyResult != "등록되지 않은 사번입니다") {
				var confimResult = prompt("사원 '"+getMaskedName(verifyResult)+"을 삭제하시겠습니까? 예 / 아니오");
				if(confimResult == "예") {
					var targetIndex = employees.map((emp) => emp.name).indexOf(verifyResult);
					employees.splice(targetIndex, 1);
					this.loadDataToTable();
				}
			}
			else {
				alert(verifyResult);
			}
		}
	},

//----- 기존의 기능 --------------------------------------------------------------------------------------------------------------

	getEmployeeInfoById: function(emp_id){ //사번으로 직원정보를 조회하는 함수

		for(var i=0; i<employees.length; i++) {
			if (employees[i].employee_id == emp_id) {
				return employees[i].name;
				/*(
					"사번:"+employees[i].employee_id+", "+
					"이름:"+employees[i].name+", "+
					"직위:"+employees[i].position+", "+
					"근무개월수:"+employees[i].working_months+", "+
					"연봉:"+employees[i].salary
				);*/
			}	
		}
		return "not registered"; 
	},
	getEmployeesTaskById: function(emp_id){ //사번으로 직원 담당업무를 조회하는 함수

		for(var i=0; i<tasks.length; i++) {
			if (tasks[i].person_in_charge == emp_id) {
				return (
					"업무코드:"+tasks[i].task_id+", "+
					"업무명:"+tasks[i].task+", "+
					"공수:"+tasks[i].working_hours+", "+
					"담당직원:"+tasks[i].person_in_charge
				);
			}	
		}
		return "할당된 업무가 없습니다"; 
	}
};
function getMaskedName(target_name) {
	return target_name.replace(/(?<=.{1})./gi, "*");
}

//Modal
var modal = document.getElementById("myModal"); // Get the modal
var span = document.getElementsByClassName("close")[0]; // Get the <span> element that closes the modal
function showModal(toggle_YN) {
	if(toggle_YN == "Y") modal.style.display = "block"; // When the user clicks on the button, open the modal
	else if(toggle_YN == "N")  modal.style.display = "none"; // When the user clicks on <span> (x), close the modal
}
span.onclick = function () { showModal("N"); };
window.onclick = function(event) { // When the user clicks anywhere outside of the modal, close it
  if (event.target == modal) modal.style.display = "none";
}
//모달 소스 출처. w3schools https://www.w3schools.com/howto/howto_css_modals.asp

//Loader 
var loader = document.getElementById("myLoader"); 
function showLoader(toggle_YN) {
	if(toggle_YN == "Y") loader.style.display = "block"; 
	else if(toggle_YN == "N")  loader.style.display = "none"; 
}

//document.getElementById("b").value;
} catch(e) { console.dir(e); }
</script>

 

여기까지 작성/저장하시고 .html 파일을 열면, 다음과 같은 화면이 출력될 것입니다.

 

메모장 대신에 html 소스를 출력해주는 사이트를 이용할 수도 있습니다.

대표적으로

w3schools( https://www.w3schools.com/html/tryit.asp?filename=tryhtml_default ) 이나

jsbin( https://jsbin.com/?html,output )이 있겠습니다. 

w3schools                                                                                                                           jsbin

 

참고로 정보 수정 기능은 여러분의 몫으로 남겨두어 구현하지 않았습니다.

 

혹시 여러분은 프로그래밍 하고 싶은 것이 있나요?

사실 개발은 이런 기대들로부터 시작된답니다. 

 

프로그램 맛보기 시리즈가 여러분께 도움이 되셨기를 바랍니다.

좋은 하루되세요.

 

-----------------------------------------------------------------------------------------------------------------------------------

추가로 data 부분을 다른 파일로 나눠 사용할 수도 있습니다.

data 부분을 data.js로 옮기고, 개발연습.html 에는 아래 외부스크립트를 추가하는 링크를 연결하여 적용이 가능합니다.

 

개발연습.html

<script type="text/javascript" src="data.js"></script>

data.js

//----- 서비스에 사용될 Data들 ---------------------------------------------------------------------------------------------------
var employees = [ //시스템에 등록된 사원목록
	{ 
		employee_id: '12345',
		name: '소영희', 
		position: '대리', 
		working_months: 36,
		salary: 4000
	}, 
	{ 
		employee_id: '67890',
		name: '장경식', 
		position: '과장', 
		working_months: 52,
		salary: 5300
	}, 
	{ 
		employee_id: '14703',
		name: '정명준', 
		position: '차장', 
		working_months: 85,
		salary: 6000
	}
];
var tasks = [ //시스템에 등재된 업무목록
	{  
		task_id: '54321',
		task: 'xx프로젝트 팀원',
		working_hours: 42,
		person_in_charge: '67890'
	}, 
	{  
		task_id: '09876',
		task: 'xx프로젝트 영업지원',
		working_hours: 57,
		person_in_charge: '12345'
	}
];

 

'웹개발 > 개론' 카테고리의 다른 글

웹개발자 필수 소양  (0) 2022.02.24
프로그래밍 맛보기(2부)  (0) 2021.07.15
프로그래밍 맛보기(1부)  (1) 2021.07.13
JAVA 기본 문법  (0) 2019.12.21
개발(프로그래밍)에 대하여  (0) 2019.12.21

안녕하세요 프로그래밍 맛보기 1부에 이어서,

프로그래밍 맛보기 2부를 작성하게 되었습니다.

2부에서는 1부에서 다루지 못했던 '객체'를 다루려고 합니다.

 

일반적으로 객체는 우리가 특정된 무엇을 설명하려고 할때의 대상을 가르켜 말합니다.

프로그래밍에서의 객체 또한 프로그래밍의 세계에서 특정 무엇을 설명/정의해놓은 로직이라 말할 수 있습니다. 

그것이 어떻게 설명되어지는지 한번 알아보도록 하겠습니다.

 

메모장을 열어 새로운 (.html)파일을 생성해보겠습니다.

다음과 같이 작성하고 저장하겠습니다.

이 또한 .html 파일을 열어보시면 다음과 같은 결과를 얻으실 수 있습니다.

이것이 우리가 프로그래밍 세계에서 정의한 객체입니다.

어리둥절하시죠? 우리가 정의한 객체에 대해 좀 더 파혜쳐보도록 하겠습니다.

그렇습니다 프로그래밍 세계에서는 이렇게 객체를 정의해두고, 객체로 업무를 수행하게 됩니다.

익숙해지기 위해 좀 더 작성해보도록 하겠습니다.

//2. 내장된 객체 이용하기 
var map1 = new Map();
map1.set('key', 'value');
alert(map1.get('key'));

 이와 같이 수행을 하니 다음과 같은 결과가 출력됩니다.

헌데 Map이라는 객체는 우리가 정의하지 않았음에도 사용이 가능하다는걸 알 수 있습니다.

Map이라는 객체는 자바스크립트 코드를 실행하는 (브라우저)엔진에 내장(정의)되어있기 때문입니다.

우리가 이 객체를 볼수가 없는데 어떻게 사용할 수 있을까요?

이런 내장된 함수들의 스펙은 많은 레퍼런스/도큐먼트에서 제공되어지고 있으므로

구글링 조금만 해보시면 금방 찾으실 수 있습니다.

아래는 제가 찾은 Map객체에 대해 설명해놓은 레퍼런스 입니다. 참고해보시죠.

https://www.w3schools.com/Js/js_object_maps.asp

 

다음 코드를 작성해보시면서 좀 더 알아보도록 하시겠습니다.

<script>

//1. 객체 생성 및 제어
class UserObject {
  constructor(parameter1, parameter2) {
    this.name = parameter1;
    this.age = parameter2;
  }

  // Getter
  get userInfo() {
    return "이름:" + this.name + ", 나이:" + this.age;
  }

  changeInfo(changed_name, changed_age) {
  	this.name = changed_name;
    this.age = changed_age;
  }
}

var userObject = new UserObject("강용구", "38");
alert(userObject.userInfo);

userObject.changeInfo("고진석", "27");
alert(userObject.userInfo);

//2. 내장된 객체 이용하기 
var map1 = new Map();
map1.set('key', 'value');
alert(map1.get('key'));

//-------------------------------------------------> 여기까지 진행했습니다~

//3. 다른 방식으로 객체 다뤄보기 
//3_1. 생성자 방식 
var order = new Object(); 
order.product_name = '생강차'; 
order['cost'] = 3500; 
order.receipt = function(){ 
	return `주문하신 ${this.product_name}, ${this.cost}원 입니다.`; 
};
alert(order.receipt());

//3_2. 리터럴 방식 
var book = { 
	name: '바람의검귀(하)', 
	genre: '무협', 
	bookInfo: function(){ 
		return `책명: ${this.name}, 장르: ${this.genre}`; 
	} 
};
alert(book.bookInfo());

//4. 숙제. 본인만의 객체를 만들어보세요

//5. 따라하기. 다음 인사관리 업무모델을 따라 만들어보세요
var employees = [ //시스템에 등록된 사원목록
	{ 
		employee_id: '12345',
		name: '소영희', 
		position: '대리', 
		working_months: 36,
		salary: 4000
	}, 
	{ 
		employee_id: '67890',
		name: '장경식', 
		position: '과장', 
		working_months: 52,
		salary: 5300
	}
]
var tasks = [ //시스템에 등재된 업무목록
	{  
		task_id: '54321',
		task: 'xx프로젝트 팀원',
		working_hours: 42,
		person_in_charge: '12345'
	}, 
	{  
		task_id: '09876',
		task: 'xx프로젝트 영업지원',
		working_hours: 57,
		person_in_charge: '12345'
	}
]
var hrd = {
	getEmployeeInfoById: function(emp_id){ //사번으로 직원정보를 조회하는 함수

		for(var i=0; i<employees.length; i++) {
			if (employees[i].employee_id == emp_id) {
				return (
					"사번:"+employees[i].employee_id+", "+
					"이름:"+employees[i].name+", "+
					"직위:"+employees[i].position+", "+
					"근무개월수:"+employees[i].working_months+", "+
					"연봉:"+employees[i].salary
				);
			}	
		}
		return "사원정보가 없습니다"; 
	},
	getEmployeesTaskById: function(emp_id){ //사번으로 직원 담당업무를 조회하는 함수

		for(var i=0; i<tasks.length; i++) {
			if (tasks[i].person_in_charge == emp_id) {
				return (
					"업무코드:"+tasks[i].task_id+", "+
					"업무명:"+tasks[i].task+", "+
					"공수:"+tasks[i].working_hours+", "+
					"담당직원:"+tasks[i].person_in_charge
				);
			}	
		}
		return "할당된 업무가 없습니다"; 
	}
}
alert(hrd.getEmployeeInfoById('67890')); //사번이 67890인 직원 정보 조회
alert(hrd.getEmployeesTaskById('12345')); //사번이 67890인 직원 담당업무 조회

</script>

5. 업무(비즈니스)모델 출력 결과

 

코딩을 하시면서 프로그래밍에 대해 흥미가 생기시나요?

앞에서 말씀드린 기본 개념을 숙지하시면서 

레퍼런스들을 구글링/서적으로 찾아가시면서

내가 구상하는 서비스를 충분히 제작하실 수도 있습니다.

 

물론 그러시려면 열정이라는 무기를 쥐고 부단하게 노력하는 자세로,

목표에 한발한발 내딛여가는 여정을 시작하셔야 겠습니다. 

 

좋은 하루되세요

 

 

'웹개발 > 개론' 카테고리의 다른 글

웹개발자 필수 소양  (0) 2022.02.24
프로그래밍 맛보기(3부)  (0) 2021.07.18
프로그래밍 맛보기(1부)  (1) 2021.07.13
JAVA 기본 문법  (0) 2019.12.21
개발(프로그래밍)에 대하여  (0) 2019.12.21

안녕하세요. 프로그래밍에 관심이 있지만 처음 접하시는 분들이

프로그래밍을 쉽고, 간단하고, 재밌게 맛보도록 해드리기 위해 다음 글을 쓰게 되었습니다. 

한번 경험해보시겠다면 저를 따라오시죠~

 

우선 프로그래밍을 시작하기에 앞서

개발환경, 개발툴을 갖추어야 하는데요.

저는 자바스크립트/HTML 로만 진행할것 이어서

컴퓨터에 notepad.exe(메모장) 만 깔려있으셔도 따라오실 수 있습니다. 

물론 VSCode나 SublimeText와 같은 텍스트 에디터가 있다면

더욱 편리하게, 또 격식있게 프로그래밍을 경험하실 수 있겠지만요

 

우선 처음이시니 작업표시줄의 시작, 돗보기 옆에 note...를 치시고 

메모장을 열어보겠습니다.

 

 

그리고 다음을 작성하겠습니다

아자! 개발 입문하기!
<script>

	//1. 변수와 연산
	var x = 1; //* 숫자 형(타입)
	var y = 2;
	alert(x+y);

</script>

작성 후에 저장을 하시는데요, 파일 형식을 모든 파일로 바꾸시고

아래와 같이 '파일명.html' 형태로 확장자를 .html로 저장하시는 것이 포인트가 되겠습니다!

 

여기까지 하셨다면 아래와 같이 파일이 생성 되셨을텐데요. 이것을 실행해봅시다.

 

그러면 이렇게 뚝허니 '3' 이라고 알람창이 등장합니다.

그렇습니다. 우리는 위의 코드를 작성하여 아래의 동작을 실행시킨 것입니다.

보아하니 3은 위의 코드에서 x=1, y=2 로 선언했던 값들을 x+y로 연산하였기 때문에

나타난 것임을 알 수 있습니다. 

뭐가 뭔지 아직 잘 모르시겠다구요? 

네 그럴 수 있습니다. 처음해본다면 모든게 낮설 수 밖에 없습니다.

그럼 조금 더 작성(프로그래밍)해보겠습니다.

아자! 개발 입문하기!
<script>

	//1. 변수와 연산
	var x = 1; //* 숫자 형(타입)
	var y = 2;
	alert(x+y);

	//2. 함수와 함수호출
	function fx() {
		alert("나는 함수라네~"); //* 문자 형(타입)
	}
	fx();

	//3. 서랍장 같은, 배열 
	var array = [10, 20, 30, 40];
	alert("3번. "+ array[0]);

</script>

그리고 해당 파일을 다시 실행해보면... 다음과 같은 결과를 확인하실 수 있습니다.

조금 적응되시는지요? 

그렇습니다 익숙해지시려면 지금까지 했던것 처럼 적응될때까지 계속 쓰고/보고 또 쓰고/보고 해야할 것입니다.

작성 안을 드릴테니 더 많은 코드를 작성해보고 경험해보시겠습니다.

아자! 개발 입문하기!
<script>
	//* 다음을 따라 적고, 그리고 브라우저 화면에서 확인해보세요~
	//  이것이 공부입니다. alert()의 주석을 풀어 결과물을 확인해보세요~

	//1. 변수와 연산
	var x = 1; //* 숫자 형(타입)
	var y = 2;
	//alert(x+y);

	//2. 함수와 함수호출
	function fx() {
		//alert("나는 함수라네~"); //* 문자 형(타입)
	}
	fx();

	//3. 서랍장 같은, 배열 
	var array = [10, 20, 30, 40];
	//alert("3번. "+ array[0]);

	//4. 반복 업무, 반복문(for, while) 
	//4_1.
	for(var i=1; i<=3; i++) { //세번 반복 
		//alert("4_1번. "+ array[i]);
	}
	//4_2.
	var j=1;
	while(j<=3) { //세번 반복 
		//alert("4_2번. "+ array[j]);
		j++;
	}

	//5. 만약에 이럴때, 조건문(if, switch-case) 
	//5_1.
	var jogun1 = 2 < 3; //2가 3보다 작다. '참' 으로 다음을 실행
	var jogun2 = true || false; //true || false 는 true를 반환 함으로 다음을 실행 
	if(jogun1) { 
		//alert("5_1번. "+ jogun1); //* true, false 는 논리 형(타입)이라고 부릅니다
	}
	//5_2.
	var jogun3 = "bannana";
	switch(jogun3) { //true || false 는 true를 반환 함으로 다음을 실행 
		
		//case "apple": alert("5_2번. 사과"+ jogun3); break;
		//case "bannana": alert("5_2번. 바나나"+ jogun3); break;
		//default: alert("5_2번. 종료"+ jogun3); break;
	}

	//6. 숙제. 반복문을 이용하여 구구단 9단까지 찍어보세요 
	//alert("구구단 시작!");
	var dan = 2; //힌트로, 이는 2단 예시입니다!
	for(var i=1; i<=9; i++) {
		//alert(dan + "x" + i + "=" + i*dan);
	}

</script>


<!-- 7. 따라해보기. 같이 따라해보아요~
	    흰벽에 내가 좋아하는 액자(.img)를 걸어보기 -->

<!-- 벽 입니다 -->
<div id="wall" style="padding:10">
	나는 벽. 여기에다 액자를 걸어두지..<br><br><br><br>
</div>

<script>

	//액자1 
	document.getElementById("wall").innerHTML += "<div class='frame'><img src='https://source.unsplash.com/random/500x500?sig=1' style='height:250;'></div>";

	//액자2
	document.getElementById("wall").innerHTML += "<div class='frame'><img src='https://picsum.photos/500/500' style='height:250;'></div>";

	//액자3
	document.getElementById("wall").innerHTML += "<div class='frame'><img src='https://random.imagecdn.app/500/500' style='height:250;'></div>";

</script>

<!-- 아래는 이미지를 액자스럽게 꾸며주는 스타일 소스 입니다. 작성하셔도 되고, 안하셔도 됩니다 -->
<style>
img {
  border:solid 2px;
  border-bottom-color:#ffe;
  border-left-color:#eed;
  border-right-color:#eed;
  border-top-color:#ccb;
  max-height:100%;
  max-width:100%;
}

.frame {
  background-color:#ddc;
  border:solid 5vmin #eee;
  border-bottom-color:#fff;
  border-left-color:#eee;
  border-radius:2px;
  border-right-color:#eee;
  border-top-color:#ddd;
  box-shadow:0 0 5px 0 rgba(0,0,0,.25) inset, 0 5px 10px 5px rgba(0,0,0,.25);
  box-sizing:border-box;
  display:inline-block;
  margin:5vh 5vw;
  height:40vh;
  padding:4vmin;
  position:relative;
  text-align:center;
  &:before {
    border-radius:2px;
    bottom:-2vmin;
    box-shadow:0 2px 5px 0 rgba(0,0,0,.25) inset;
    content:"";
    left:-2vmin;
    position:absolute;
    right:-2vmin;
    top:-2vmin;
  }
  &:after {
    border-radius:2px;
    bottom:-2.5vmin;
    box-shadow: 0 2px 5px 0 rgba(0,0,0,.25);
    content:"";
    left:-2.5vmin;
    position:absolute;
    right:-2.5vmin;
    top:-2.5vmin;
  }
}
//액자스타일 출처: https://codepen.io/chris22smith/pen/PbBwjp

//9. 숙제. 구글링을 하셔서 이(액자 스타일)와 같은 꿀템 소스들을 잘활용해보세요~
</style>

 

여기까지 잘 따라오셨다면~ 이 처럼 프로그래밍으로 벽에다 액자도 걸어보셨을 겁니다. 

<script>
//+ 액자4
document.getElementById("wall").innerHTML += "<div class='frame'><img src='"
	+"https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FbE1kG7%2Fbtq9qjY5W5x%2FAAAAAAAAAAAAAAAAAAAAADXGqgMz6a1NqJejCba9TkkUDNZzCErfx9eoo9K-K0WX%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1753973999%26allow_ip%3D%26allow_referer%3D%26signature%3DhnG5E89Ix56AH58XVa%252BD2HSMDq8%253D"
+"' style='height:250;'></div>";
</script>

 

고생하셨습니다~ 즐거운 하루되세요

'웹개발 > 개론' 카테고리의 다른 글

프로그래밍 맛보기(3부)  (0) 2021.07.18
프로그래밍 맛보기(2부)  (0) 2021.07.15
JAVA 기본 문법  (0) 2019.12.21
개발(프로그래밍)에 대하여  (0) 2019.12.21
server-side 언어중 JAVA에 대하여  (0) 2019.12.21

 

 

'웹개발 > 개론' 카테고리의 다른 글

프로그래밍 맛보기(2부)  (0) 2021.07.15
프로그래밍 맛보기(1부)  (1) 2021.07.13
개발(프로그래밍)에 대하여  (0) 2019.12.21
server-side 언어중 JAVA에 대하여  (0) 2019.12.21
웹 개발 입문하기전에...  (0) 2019.12.21

개발은 한편의 시나리오이다.

어떤 컴포넌트들을, 또 그들에 대해 어떤 시나리오를 쓸것인가?

예외처리는 그 시나리오에서 벗어나는 상황을 처리하는 다른 시나리오이다. 

 

즉 개발을 한다는 것은 시나리오를 작성하는 행위의 연속이다.

그래서 생각의 연속이며, 고뇌의 연속이다.

또한 생각을 구체화/구현하는데 많은 연구와 수고가 필요하다.

그것을 수행하기 위해 보통 앉아서 보내는 시간이 상당히 많다.

일과 일상을 넘어서 쉴새없이 생각해야할때도 있다.

 

개발은 이런 것이므로 호불호가 강할 수 있는 분야라 할 수 있겠다.

'웹개발 > 개론' 카테고리의 다른 글

프로그래밍 맛보기(2부)  (0) 2021.07.15
프로그래밍 맛보기(1부)  (1) 2021.07.13
JAVA 기본 문법  (0) 2019.12.21
server-side 언어중 JAVA에 대하여  (0) 2019.12.21
웹 개발 입문하기전에...  (0) 2019.12.21

웹 개발에서 server-side 언어는 다양하다. php, Python 등.

그런데 왜 많고 많은 언어중에 JAVA가 많이 쓰일까?

그 이유는 세가지 정도로 생각해본다.

 

1. 모듈단위 개발에 적합하고 재사용성이 좋다.

2. 라이브러리 및 레퍼런스가 풍부하다. https://docs.oracle.com/javase/7/docs/api/ 참조

3. STS 등 개발 툴이 막강하다.

 

범용적인 언어이고 역사도 역사인 만큼 사용 편의성이 많이 발전 되어온 개발 언어이다. 

JAVA의 역사를 거슬러 올라간다면...

1995년 썬시스템즈의 제임스 고슬링이 하드웨어 호환성이 좋은 언어를 개발하면서 JAVA를 탄생시켰다.

JAVA의 특징으로는 JVM(Java Virtual Machine)을 통해서 구동이 되며,

JVM은 linux, windows 등 다양한 운영체제에서 설치가 가능하다.

 

JVM은 아래와 같은 형태로 구성이 되어있다.

[참조] server-side 언어중 JAVA에 대하여[https://wbman.tistory.com/]. (2019.12.21). URL: http://edu.copykiller.com/edu-source/faq/?mod=document&uid=156

 

그리고 JAVA는 네가지의 에디션이 있다.

Java SE(Java Standard Edition / J2SE)

Java EE(Java Enterprise Edition / J2EE)

Java ME(Java Micro Edition / J2ME)

JavaFX

 

이중에서 웹개발은 이중에서 Java EE을 사용하게 된다. 

 

자바언어의 큰 특징은 객체지향언어이며, 강타입 언어(strictly typed language)이다.

즉 개발을 진행할때 타입을 명확히 선언해주어야 하는 부분이 있다. 그렇지 않으면 에러가 발생한다. 

그 점을 꼭 주의하고 개발해야한다.

JAVA로 개발하면서 정말 많이 접하게 되는 NumberFormatException이 이런 자바의 특성을 말해준다.

 

'웹개발 > 개론' 카테고리의 다른 글

프로그래밍 맛보기(2부)  (0) 2021.07.15
프로그래밍 맛보기(1부)  (1) 2021.07.13
JAVA 기본 문법  (0) 2019.12.21
개발(프로그래밍)에 대하여  (0) 2019.12.21
웹 개발 입문하기전에...  (0) 2019.12.21

개인용 PC, 노트북, 스마트폰이 등장하면서

컴퓨터와 인터넷은 우리 생활에서 빠질 수 없는 컨텐츠가 되었습니다.

그 중에서도 거대한 컴퓨터 통신망인 인터넷을 활용할 수 있게 해주는 웹 브라우저를 많이 쓰실겁니다.

우리는 인터넷 익스플로러나 크롬과 같은 웹 브라우저를 이용하여 구글과 같이 검색엔진을 지원하는 포털 사이트에 방문하여 다양한 컨텐츠들을 검색 할수 있고, 이를 통해 쇼핑몰의 홈페이지를 찾고 방문하여 쇼핑몰의 물건들을 검색하고, 회원 가입을 하고, 물건을 구매 할 수도 있습니다. 그리고 이 블로그에 방문하시게 된것도 '웹 개발이란 것이 무엇인가?'라는 호기심에 키워드를 검색하여 방문하게 되셨을 겁니다.

 

여기까지 정리해볼때 인터넷은 거대한 컴퓨터 통신망이고,

우리는 그 통신망을 이용하여 서로의 필요를 찾고 제공하고 있습니다.

그리고 웹 브라우저라는 프로그램을 통해 그 통신망을 이용하고 있습니다.

 

브라우저(browser)는 검색기라는 의미입니다. 그렇다면 웹이란 무엇일까요.

웹은 1980년 팀버너스리 라는 사람이 구상한 Hypertext 중심 정보 관리 시스템입니다.

그리고 각 Hypertext들은 HTML(Hypertext Mark-up Language)으로 작성됩니다.

 

HTML은 하나의 컴퓨터 언어이지만 작성된 코드는 웹 브라우저를 통하여

사용자에게 제작자가 의도한 화면을 출력하게 됩니다.

그렇다면 HTML만으로 웹 개발이 진행될까요?

 

사실 HTML만으로 웹개발을 하기에는 한계가 있습니다.

로그인과 같이 우리가 흔히 클릭하고 동작하는 기능들은 HTML만으로는 구현할 수 없기 때문입니다.

이런 동작적인 부분을 구현하기 위해서는 WAS와 대표적으로 JAVA와 같은 서버언어가 필요합니다.

또 필요에 따라 데이터베이스가 필요하기도 합니다.

 

즉 웹 개발을 하기 위해선 우리는 몇가지 언어와 툴들을 알아야 합니다.

하나 하나 짚어 드리기 전에 우선 웹 페이지의 동작 과정을 말씀드리겠습니다.

 

1. 사용자 화면(client):

사용자는 화면의 검색바 또는 url을 통해 제공자에게 서비스를 요청(request)한다.

2. WAS는 그 요청을 제공자에게 전달한다. 

3. 제공자 즉 서버(server)는 서비스를 반환하여 그 요청에 응답(response)한다.

 

여기서 확인 할 수 있는건 제공자에게 서비스를 요청할 수 있는 사용자 화면이 존재하며,

제공자 측에서 요청에 따라 서비스를 처리 한다는 것입니다.

그 사용자 화면을 클라이언트단(client-side),

서비스를 제공하는 로직 부분을 서버단(server-side)이라 부릅니다.

 

클라이언트단을 개발하는데 필요한 언어로는

HTML, CSS, Ajax 등 클라이언트 언어가 필요하며

 

서버단을 개발하는데 필요한 언어로는 

JAVA 또는 Python 등 서버 언어,

부가적으로 데이터베이스 및 데이터베이스 언어 SQL이 필요합니다.

 

여기까지 참고하시고 개발을 시작해봅시다.

'웹개발 > 개론' 카테고리의 다른 글

프로그래밍 맛보기(2부)  (0) 2021.07.15
프로그래밍 맛보기(1부)  (1) 2021.07.13
JAVA 기본 문법  (0) 2019.12.21
개발(프로그래밍)에 대하여  (0) 2019.12.21
server-side 언어중 JAVA에 대하여  (0) 2019.12.21

+ Recent posts