1. Spring Boot 설치

- java-21 설치가 되어있다는 가정

https://spring.io/ ▶ Projects메뉴 ▶ Spring tool 4 
▶ 4.24.0 - Windows X86_64 설치(spring-tool-suite-4-4.24.0.RELEASE-e4.32.0-win32.win32.x86_64.self-extracting.jar) 
▶ spring boot 폴더 만들어서 여기에 압축 풀기 ▶ contents.zip 압축 여기에 풀기 ▶ sts-4.24.0.RELEASE폴더 
▶ SpringToolSuite4.exe 가 실행파일임
파일 ▶ NEW ▶ Spring Starter Project
▶ Name test로 변경, Type Maven으로 변경, Packaging War로 변경, Java version 21로 변경, Group com.example.test로 변경, pacakge com.example.test로 변경 ▶ Dependencies 단계에서 맨아래 Web클릭 후 Spring Web 체크 ▶ Finish


* resources ▶ static : CSS 같은 정적 코드 위치
* application.properties : 설정값 작성
* src ▶ main ▶ webapp : War


2. JSP 설치

부트는 JSP를 기본적으로 지원 안함. 별도 설치 필요.
Help ▶ Eclipse MarketPlace ▶ jsp 검색 ▶ Eclipse EnterPrise Java and Web Developer Toos 3.33 설치 ▶ Confirm ▶ Accept 선택 Finish ▶ Trust Artifacts 단계에서 Select All 클릭 후 Trust Selected 클릭 ▶ Restart 클릭

webapp 폴더 안에 WEB-INF 폴더 생성 ▶ 그 안에 view 폴더 생성 

src/main/java 우클릭 패키지 com.example.test.controller 입력해서 생성 ▶ 패키지 안에 HomeController 클래스 생성 
▶ 컨트롤러 세팅

@Controller
public class HomeController {

@RequestMapping("/")
@ResponseBody
   public String home() {
        return "hello, Spring boot!!";
   }
}


▶ Run - Spring boot app로 실행해서 에러 안뜨면 세팅 성공 ▶ 브라우저에 http://localhost:8080/치면 출력 잘됨
* 톰캣이 내장되어있어서 실행 가능


3. 서버 포트 설정 변경해보기

application.properties에서 설정 변경  ▶

spring.application.name=test

#server
server.servlet.context-path=/test
server.port=8888


▶ 서버 껐다가 다시 켜기 ▶ 브라우저에 http://localhost:8888/ 입력하면 출력 잘됨


4. JSTL 의존성 주입

JSP - javax.servlet.jstl  의존성 주입 필요

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
</dependency>
=> 자카르타로 변경


pom.xml ▶ https://maven.apache.org/xsd/maven-4.0.0.xsd 에러나면 http로 바꾸거나 다운로드 ▶내용 수정

<!--JSP 사용하기위해 자카르타 추가-->
<dependency>
   <groupId>jakarta.servlet</groupId>
   <artifactId>jakarta.servlet-api</artifactId>
</dependency>

<dependency>
      <groupId>org.glassfish.web</groupId>
      <artifactId>jakarta.servlet.jsp.jstl</artifactId>
</dependency>

<dependency>
   <groupId>jakarta.servlet.jsp.jstl</groupId>
   <artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
</dependency>

<!--톰캣-->
<dependency>          
     <groupId>org.apache.tomcat.embed</groupId>
     <artifactId>tomcat-embed-jasper</artifactId>
 </dependency>

▶ views 폴더에 index.jsp 만들고 HomeController에 

@RequestMapping("/welcome")
public String welcome() {
     return "WEB-INF/views/index.jsp";
}

내용 추가 ▶ 서버 재실행 ▶ 브라우저에 http://localhost:8888/test/welcome 치면 출력 잘됨


5. View resolver 설정

application.properties ▶ 

#view resolver
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp


▶ HomeController 수정

@Controller
public class HomeController {

@RequestMapping("/")
@ResponseBody
   public String home() {
        return "hello, Spring boot!!";
   }

@RequestMapping("/welcome")
   public String welcome() {
         return "index";
   }
}

6. 파라미터 테스트

HomeController ▶

@RequestMapping("/modelTest")
public String modelTest(Model model) {
   model.addAttribute("name", "abcdefg");
   model.addAttribute("tel", "123-1234");
   return "modelTest";
}

 

▶ modeTest.jsp ▶

<html>
  <head>
     <meta charset="UTF-8">
     <title>modelTest.jsp</title>
  </head>
  <body>
     이름 : ${name} <br>
     전화번호 : ${tel} <br>
  </body>
</html>

▶ http://localhost:8888/test/modelTest


7. JDBC 의존성 주입

org.springframework.boot spring-boot-starter-jdbc 
cohttp://m.oracle.database.jdbc ojdbc8
의존성 주입 필요

pom.xml 추가 ▶

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

<dependency>
    <groupId>com.oracle.database.jdbc</groupId>
    <artifactId>ojdbc8</artifactId>
    <scope>runtime</scope>
</dependency>


application.properties 추가 ▶

#jdbc
spring.datasource.driver-class-name=oracle.jdbc.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@localhost:1521:xe
spring.datasource.username=fin02
spring.datasource.password=fin02

8. MyBatis

프로젝트 우클릭 ▶ Spring ▶ Add Starters ▶ Available 영역에 mybatis 검색 ▶ MyBatis Framework 체크 ▶ pom.xml 체크 ▶ Finish ▶ pom.xml 들어가면 의존성 주입 되어있음

application.properties ▶ 

#mybatis
mybatis.type-aliases-package=com.example.test.dto
mybatis.mapper-locations=/mybatis/**/*-mapper.xml
mybatis.configuration.map-underscore-to-camel-case=true


src/main/resources 안에 mybatis 폴더 추가 ▶ mybatis 폴더 안에 student 폴더 추가 ▶ student-mapper.xml 파일 생성

student-mapper.xml ▶ 

<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-mapper.dtd">

 
* 독타입 에러나면
windows ▶ preference ▶ Language Servers 더블클릭 ▶ XML 체크 해제 ▶ Apply

▶ 내용 입력

<mapper namespace="mybatis.student.student-mapper">
    <select id="listStudent" resultType="StudentDTO">
         select * from student
    </select>
</mapper>

 

▶com.example.test.mapper 패키지 만들기

@Service
public class StudentMapper {

    @Autowired
    private SqlSession sqlSession;

    public List listStudent(){
       return sqlSession.selectList("listStudent");
    }
}


▶ StudentController


9. 학생관리 예제

StudentController
package com.example.test.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import com.example.test.dto.StudentDTO;
import com.example.test.mapper.StudentMapper;


@Controller
public class StudentController {

    @Autowired
    private StudentMapper studentMapper;


    @RequestMapping("/list.do")
    public String list(Model model) {
        List<StudentDTO> list = studentMapper.listStudent();
        model.addAttribute("listStudent", list);
        return "list";
    }

    @GetMapping("/insert.do")
        public String insertForm(){
        return "insert";
    }

    @PostMapping("/insert.do")
        public String insert(@ModelAttribute StudentDTO dto){
        int res = studentMapper.insertStudent(dto);
        return "redirect:welcome";
    }

    @GetMapping("/delete.do")
        public String deleteForm(){
        return "delete";
    }

    @PostMapping("/delete.do")
        public String delete(@RequestParam String id){
        int res = studentMapper.deleteStudent(id);
        return "redirect:welcome";
    }

    @GetMapping("/find.do")
        public String findForm() {
        return "find";
    }

    @PostMapping("/find.do")
        public String find(Model model, @RequestParam String name){
        List<StudentDTO> list = studentMapper.findStudent(name);
        model.addAttribute("listStudent", list);
        return "list";
    }
}

 

StudentMapper
@Service
public class StudentMapper {

    @Autowired
    private SqlSession sqlSession;

    public List<StudentDTO> listStudent(){
        return sqlSession.selectList("listStudent");
    }

    public int insertStudent(StudentDTO dto) {
        return sqlSession.insert("insertStudent", dto);
    }

    public int deleteStudent(String id) {
        return sqlSession.delete("deleteStudent", id);
    }

    public List<StudentDTO> findStudent(String name){
        return sqlSession.selectList("findStudent", name);
    }

}

 

student-mapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
 
    <mapper namespace="mybatis.student.student-mapper">
       <select id="listStudent" resultType="StudentDTO">
           select * from student
        </select>

       <insert id="insertStudent" parameterType="StudentDTO">
            insert into student values(#{id}, #{name}, #{cname})
        </insert>

       <delete id="deleteStudent" parameterType="String">
            delete from student where id=#{id}
        </delete>
   
        <select id="findStudent" parameterType="String" resultType="StudentDTO">
            select * from student where name = #{name}
        </select>
    </mapper>

 

list.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
    <head>
        <title>학생목록</title>
    </head>
    <body>
        <div align="center">
            <hr color="green" width="300">
            <h2>학 생 목 록 페 이 지</h2>
            <a href="index.do"> 처음으로 </a>
            <hr color="green" width="300">
            <a href="insert.do"> 학생등록페이지 바로가기</a>

            <table border="1" width="500">
                <tr bgcolor="yellow">
                    <th>아이디</th>
                    <th>학생명</th>
                    <th>학급명</th>
                </tr>
                <c:if test="${empty listStudent}">
                     <tr>
                         <td colspan="3">등록된 학생이 없습니다.</td>
                     </tr>
                </c:if>
                <c:forEach var="dto" items="${listStudent}">
                 <tr>
                  <td align="center">${dto.id}</td>
                  <td align="center">${dto.name}</td>
                  <td align="center">${dto.cname}</td>
                  </tr>
                </c:forEach>
            </table>
     </div>
     </body>
</html>

 

insert.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
     <head>
          <meta charset="UTF-8">
          <title>insertForm.jsp</title>
     </head>
     <body>
          <div align="center">
               <hr color="green" width="300">
               <h2>학 생 등 록 페 이 지</h2>
               <hr color="green" width="300">
               <form name="f1" action="insert.do" method="post">
                    <table border="1">
                         <tr>
                              <td>
                                   아이디 : <input type="text" name="id" id="mid" title="아이디"><input type="button" value="중복확인"
                                                   onclick="idCheck()"><br>
                                   학생명 : <input type="text" name="name" title="학생명"><br>
                                   학급명 : <input type="text" name="cname" title="학급명"><br>
                              <input type="submit" value="입력">
                              <input type="reset" value="다시입력">
                              </td>
                         </tr>
                   </table>
          </form>
     </div>
</html>

 

find.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
     <head>
          <meta charset="UTF-8">
          <title>Insert title here</title>
     </head>
     <body>
               <div align="center">
               <hr color="green" width="300">
               <h2>학 생 찾 기 페 이 지</h2>
               <hr color="green" width="300">
               <form name="f3" action="find.do" method="post">
                    <table border="1">
                         <tr>
                              <td>
                                   학생명 : <input type="text" name="name">
                                   <input type="submit" value="찾기">
                              </td>
                          </tr>
                    </table>
               </form>
     </div>
</body>
</html>

 

delete.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
     <head>
          <meta charset="UTF-8">
          <title>delete.jsp</title>
     </head>
     <body>
          <div align="center">
               <hr color="green" width="300">
                    <h2>학 생 삭 제 페 이 지</h2>
               <hr color="green" width="300">
               <form name="f2" action="delete.do" method="post">
                    <table border="1">
                         <tr>
                              <td>
                                   아이디 : <input type="text" name="id">
                                  <input type="submit" value="삭제">
                              </td>
                         </tr>
                    </table>
               </form>
         </div>
     </body>
</html>

 

1.  Repository 등록

github.com 접속 ▶ 회원가입 ▶ 로그인 
▶ Create a new repository ▶ Repository name : test-repo1 ▶ public 체크 ▶ Add a Readme file 
▶ 등록하고 나서는 URL https://github.com/minpoooh/test-repo1 치고 들어올 수도 있음

 


2. Repository 삭제

Settings ▶ Danger Zone ▶ Delete this repository 

3. 공개키와 개인키 생성

드라이브 ▶ 폴더 우클릭 ▶ Open Git Bash Here
▶ ssh-keygen 입력 ▶ /c/Users/user/.ssh 키가 저장되는 위치 나옴(들어가보면 파일이 두개 있음) 

▶ 엔터 ▶ 엔터 ▶ 엔터 ▶ 

4. 소스트리 개인키 설정

소스트리 실행 ▶ 도구 ▶ SSH키 추가 ▶ 개인키 파일 선택 ▶ 열기 ▶  옵션 ▶ SSH 클라이언트 설정
▶ SSH 클라이언트를 OpenSSH로 변경 

5. 깃허브 공개키 설정

깃 허브 ▶ 프로필  ▶ Settings ▶ SSH and GPG keys ▶  New SSH Key
▶ Title에 아무거나 넣고 Key에 .pub 키 파일 메모장으로 열어서 있는 내용 다 복사해서 붙여넣기 ▶ Add SSH Key 

6. 소스트리와 깃허브 연결

소스트리 ▶ New Tab ▶ Remote 탭 ▶ 계정 추가 ▶ 호스팅 서비스 : Github,  선호 프로토콜 : SSH , OAuth 토큰 새로고침 클릭 ▶ 로그인 ▶ 맨 하단에 Authorize atlassian 버튼 클릭 ▶ 소스트리 돌아오면 인증성공 처리됨 ▶ 확인 ▶ 원격저장소에 깃허브 계정 올라오고 새로고침 누르면 test-repo1 올라와있는거 확인 가능

7. Clone 

- 원격저장소에 있는 전체파일을 소스트리로 세팅하기

https://github.com/namhyung/uftrace 접속해보면 만들어져있는 파일들이 있음  ▶ <> Code 버튼 클릭 ▶ SSH 탭 
▶ 주소 복사 ▶ 소스트리 ▶ Clone 탭 ▶ 소스경로에 붙여넣기 ▶ 내경로에 내 드라이브 폴더 선택 ▶ 클론 버튼 클릭  

8. Push

- 내가 드라이브에서 수정한 파일과 내용을 원격저장소에도 반영해주기

깃허브  ▶ <> Code ▶ SSH ▶ 주소 복사 ▶ 소스트리 ▶ New Tab ▶ Remote  
▶ 저장소에 있는 test-repo1 Clone 클릭 ▶ 클론 버튼 클릭 ▶ 소스트리 탐색기 ▶ 클릭하면 폴더 생성된거 확인 가능함
▶ 소스트리 설정 ▶ origin이라는 이름으로 받아오는 원격저장소 주소가 나옴 

드라이브에 a.txt 추가하고 커밋하면 History에 origin이라고 나오는건 원격저장소, main은 내 드라이브  

▶ 소스트리 Push 버튼 클릭 ▶ Push 버튼 클릭 ▶ push 누르면 main, origin이 같은 위치로 변경됨
 ▶ 깃허브 들어와서 Commit 클릭 ▶ a.txt파일 올라온거 확인 가능함

드라이브에서 a.txt 삭제하고 b.txt추가 ▶ 소스트리에서 둘다 스테이지에 올려서 커밋 ▶ Push 

▶ 깃허브 들어와서 Commit 확인하면 b.txt만 있음

9. 패치

- 원격저장소에서 가져만 오고 병합은 내가 해야함

깃허브 ▶ b.txt 클릭 ▶ 연필모양 클릭 ▶ 내용 고치기 ▶ Commit changes ▶ 메세지 타이틀, 메세지 작성
▶ Code 탭에서 다시 b.txt를 보면 바뀐거 확인가능하고 Commits 누르면 이력 확인 가능  ▶ 소스트리 ▶ 패치
▶ 우클릭 ▶ 병합 

10. PULL

- 원격저장소에서 가져와서 병합까지 해주는 것

깃허브 ▶ Add File ▶ Create New File ▶ 파일이름 : c.txt , 내용 아무거나 적기 ▶ Commit changes ▶ c.txt 추가됨 
▶ 소스트리 ▶ PULL 

11. 협업

깃허브 ▶ Settings ▶ Collaborators ▶ 비밀번호 입력 ▶
Add people ▶ 협업할 사람 이름 넣기 ▶ 초대 메일 전송
▶ view invitation 에서 수락한 후 초대 받은 사람이 소스트리에서 New tab ▶ Clone 
▶ 브랜치 생성 ▶ 작업 ▶ 커밋 ▶ PUSH
▶ PUSH 된 내용 PULL 받아서 사용

 

 

1. 설치

https://git-scm.com/download ▶ 64-bit Git for Windows Setup 클릭해서 다운로드 
https://www.sourcetreeapp.com/ ▶ 다운로드 ▶ 건너뛰기 ▶ Mercurial 체크 해제 ▶ SSH키 아니오


2. 커밋

로컬저장소
▶ create ▶ 폴더 선택 ▶ 예 ▶ 해당폴더 들어가서 숨긴항목 봤을때 .git 폴더 있는지 확인 ▶ 폴더에 a.txt b.txt c.txt 파일만들기 ▶ 소스트리에 파일들 올라와있음  ▶  모두 스테이지에 올리기  ▶  하단에 첫번째 커밋 <br> a.txt, b.txt, c.txt추가 작성 후 커밋 클릭 ▶ 파일탐색기에서 a.txt에 아무내용이나 적고 c.txt는 삭제 ▶ 소스트리 파일상태에서 모두 스트이지 올리기  ▶ 두번째 커밋 <br> a.txt 수정 b.txt 삭제 작성 후 커밋 클릭  ▶ 두번째 커밋 완료

* 깃에서 특정 파일 제외하고 싶을 때
폴더에 .gitignore 텍스트파일 만들기(확장자X) ▶ e.txt 넣고 저장 ▶ e.txt 파일은 제외됨
.gitignore 텍스트파일에 /aaa 적고 ▶ 폴더에 aaa라는 폴더 만들어서 안에 c.txt d.txt 만들어두면 aaa폴더안의 파일도 제외됨

폴더에 c.txt 파일 만들고 세번째 커밋 


3. 버전

- 첫번째 숫자 : 주버전. 크게 다른 경우.
- 두번째 숫자 : 부버전. 새로운 기능 추가.
- 세번째 숫자 : 수버전. 버그 수정.
커밋 내용 우클릭하고 태그 클릭 ▶ 이름 v0.1.1 넣고 추가

 


4. 커밋 되돌리기

(1) revert : 기존버전 삭제 안하고 새로운 버전으로 생성
(2) reset : 되돌아가는 버전의 시점으로 되돌아감
- soft : 변경사항 유지 + 커밋 취소
- mixed : 변경사항 유지 + 스테이지, 커밋 취소
- hard : 변경사항 유지안함 (파일 내용도 원상복구)


5. 스태시(stash)

- 임시 저장기능


5. 브랜치

1) 브랜치 나누기

2) 브랜치 병합

- 반드시 master로 체크아웃해야함

- 병합 후 해당 브랜치는 삭제


6. 병합 충돌 해결

병합 후 충돌 알림 ▶ 스테이지에 올라가지 않은 파일 ▶ 클릭 ▶ 우클릭 ▶ 충돌 해결

(스테이지에 올라가지 않은 파일 내용)
<<<<<< HEAD
master_a
==========
foo_a
>>>>>> foo


1) 내 것을 이용해 충돌 해결 (=master 현재브랜치)

<<<<<< HEAD 부분
master_a

선택 후 파일상태 탭 ▶ 커밋 내용 안에 내용이 들어가 있음 ▶ 커밋 ▶ 파일 열어보면 master_a로 되어있음

2) 저장소 것을 이용해 충돌 해결 (= foo)

========== 부분
foo_a
>>>>>> foo

선택 후 파일상태 탭 ▶ 커밋 내용 안에 내용이 들어가 있음 ▶ 커밋 ▶ 파일 열어보면 foo_a로 되어있음


7. 브랜치 재배치

- 브랜치가 뻗어나온 기준점을 변경하는 것
브랜치 체크아웃 ▶ 변경할 기준점 우클릭 ▶ 재배치

1. SSH(Secure Shell)

- 원격지 호스트 컴퓨터에 접속하기 위해 사용되는 인터넷 프로토콜
- 기존의 유닉스 시스템 셸에 원격 접속하기 위해 사용하던 텔넷은 암호화가 이루어지지 않아 계정 정보가 탈취될 위험이 높으므로, 여기에 암호화 기능을 추가하여 1995년에 나온 프로토콜

Server ▶ apt -y install openssh-server 설치 ▶ 
systemctl restart ssh 재가동  ▶
systemctl enable ssh  켜기  ▶
systemctl status ssh 상태 확인(active running)  ▶
q 누르면 상태확인 종료 ▶
ifconfig  ▶ inet 주소값(10.100.0.128) 확인 ▶
▶ 루트 ▶ ufw allow ssh 또는 ufw allow 22/tcp (방화벽 설정) ▶ Server 켜져있는 상태에서 server-b 가동 ▶

server-b ▶ root / passwd 로그인 ▶ 
ssh ubuntu@10.100.0.128  ▶ 

Server ▶ su - ubuntu 입력 ▶ touch aaa.txt ▶
ls - l로 만들어진 aaa.txt 파일 확인 ▶

server-b ▶ ls -l 하면 aaa.txt파일 확인 가능
▶ nano aaa.txt 해서 아무거나 입력해서 저장 ▶ exit 입력 (SSH 접속 끄기) 

▶ Server ▶ cat aaa.txt ▶ server-b에서 저장한 내용을 확인할 수 있음

2. nslookup

- 네트워크 디버깅을 위해 자주 사용되는 리눅스 명령어
- DNS 서버에 직접 DNS 쿼리를 하고 그 결과를 출력
- DNS 설정이 정상적인지, DNS 서버가 정상적으로 동작하고 있는지, 네트워크가 의도한대로 설정되어있는지 등 확인
- 루트 ▶ nslookup ▶ http://www.naver.com ▶ ip 주소 등 확인 가능


3. 네임서버 설정

- 기본 흐름 : URL 입력 ▶ /etc/host.conf 조회 ▶ /etc/hosts에 있으면 IP 주소로 이동, 없으면 /etc/resolv.conf에 설정된게 있는지 확인한 후 연결

루트 ▶ nano /etc/resolv.conf (DNS 설정파일)  ▶ nameserver 127.0.0.53 앞에 # 붙여서 주석처리 
▶ 파이어폭스에서 네이버 접속 ▶ 접속 안되는거 확인 가능  
▶ nano /etc/hosts (호스트 이름이나 도메인 이름을 IP주소로 변환하는 운영체제 파일)
▶ 13.125.33.124 http://www.kgitbank.com 입력 
▶ 파이어폭스에서 http://www.kgitbank.com 들어가면 접속 잘 되는거 확인 가능 
▶ /etc/hosts ▶ 163.239.1.47 http://www.kgitbank.com 입력 
▶ 파이어폭스에서 http://www.kgitbank.com 들어가면 서강대학교 홈페이지로 접속됨 
/etc/resolv.conf 와 /etc/host.conf 파일 원래대로 해놓기

4. 웹서버 구축

루트 ▶ apt-get update ▶ apt install apache2 ▶
systemctl restart apache2 ▶ systemctl enable apache2 ▶ systemctl status apache2 (작동 확인) 
▶ 파이어폭스에서 url에 localhost 쳤을때 apache2 default page 화면이 나와야함 ▶  cd /var/www/html 
▶ ls -l 하면 index.html 파일이 있음 ▶ rm index.html ▶ nano index.html ▶ 
<html>
<head>
</head>
<body>
<p> My First Apache Web Page </p>
<p> <a href="./index2.html"> Original Welcome Page </a></p>
</body>
</html>
▶ nano index2.html ▶
<html>
<head>
</head>
<body>
<p> index2 page </p>
<p> index2.html  Page </a></p>
</body>
</html>
▶ 파이어폭스 url에 localhost 입력하면 index.html이 나오고 링크 클릭하면 index2.html 나옴

5. 사용자 개별 웹서버 구축

루트 ▶ nano /etc/apache2/mods-available/userdir.conf  ▶ 두번째줄 #으로 주석 처리 ▶ 저장(일반 사용자도 웹서버 구축할 수 있게 처리) 

터미널 탭 추가 ▶ su - ubuntu (사용자계정) 
▶ sudo ln -s /etc/apache2/mods-available/userdir.conf /etc/apache2/mods-enabled/userdir.conf 입력 (심볼릭 링크 걸기)  
▶ ubuntu 암호 입력  
▶ sudo ln -s /etc/apache2/mods-available/userdir.load /etc/apache2/mods-enabled/userdir.load (심볼릭 링크 걸기) 

루트 ▶ systemctl restart apache2 

사용자계정 ▶ mkdir public_html ▶ chmod 701 .  ▶ chmod 701 public_html ▶ cd public_html ▶  nano index.html ▶ 
<html>
<head>
        <title> ubuntu </title>
</head>
<body>
        <h2> ubuntu 계정으로 만들기 </h2>
</body>
</html>
▶ 파이어폭스로 url 창에 http://10.100.0.128/~ubuntu



1. 비교연산자

(테스트 예제)
nano if3.sh  ▶

#!/bin/sh
if [ 100 -eq 200 ]
then
        echo "100과 200은 같은 수입니다."
else
        echo "100과 200은 다른 수 입니다."
fi

exit 0

▶sh if3.sh ▶ 100과 200은 다른 수 입니다. 출력


(테스트 예제) -- 사용자를 입력받아 현재 사용자와 일치하는 지 알려주는 프로그램
nano if4.sh ▶

#!/bin/sh
echo 사용자 이름 입력 :
read username

if [ $username = $USER ]
then
        echo "환경변수 유저와 사용자가 일치합니다."
else
        echo "환경변수 유저와 사용자가 일치하지 않습니다."
fi

exit 0

 ▶ sh if4.sh  ▶ root 입력하면 일치, ubuntu 입력하면 불일치


(테스트 예제) -- 파일이 있는지 확인
nano if5.sh ▶

#!/bin/sh
fname=/lib/systemd/system/cron.service
if [ -f $fname ]
then
head -5 $fname
else
echo "cron 서버가 설치되지 않았습니다."
fi
exit 0

▶ sh if5.sh  ▶ 파일이 있으면 실행결과가 5줄만 나옴. 파일이 없으면 설치되지 않았다고 나옴


2. 다중분기문 : case - esac

- switch ~ case와 유사
- case 대신 값)
- break 대신 ;;
- default 대신 *)
- 값을 비교할 때 OR 조건은 |를 이용
- 정규 표현식 이용 가능
    [nN]* : 시작이 n이나 N으로 시작되는 모든 것


(테스트 예제) 
nano case1.sh ▶

#!/bin/sh
case "$1" in
start)
echo "시작";;
stop)
echo "중지";;
restart)
echo "다시시작";;
*)
echo "default";;
esac
exit 0

▶ sh case1.sh ▶
sh case1.sh : default
sh case1.sh aaa : default
sh case1.sh start : 시작
sh case1.sh stop : 중지
sh case1.sh restart : 다시시작


(테스트 예제)
nano case2.sh ▶

#!/bin/sh
echo "개인정보 제공에 동의하시겠습니까? (yes/no)"
read answer
case "$answer" in
yes | y | Y | Yes | YES)
echo "동의 처리되었습니다.";;
no)
echo "동의 거부처리되었습니다.";;
*)
echo "yes나 no를 입력해야합니다.";;
esac
exit 0

▶ sh case2.sh

▶개인정보 제공에 동의하시겠습니까? (yes/no)
zzz
yes나 no를 입력해야합니다.

▶ 개인정보 제공에 동의하시겠습니까? (yes/no)
no
동의 거부처리되었습니다.

▶ 개인정보 제공에 동의하시겠습니까? (yes/no)
yes
동의 처리되었습니다.

** 

#!/bin/sh
echo "개인정보 제공에 동의하시겠습니까? (yes/no)"
read answer
case "$answer" in
yes | y | Y | Yes | YES)
echo "동의 처리되었습니다.";;
[nN]*)
echo "동의 거부처리되었습니다.";;
*)
echo "yes나 no를 입력해야합니다.";;
esac
exit 0

▶ 이렇게 작성하면 n이나 N으로 시작하는 글자 필터



(테스트 예제)
gedit andor1.sh ▶

#!/bin/sh
echo "개인정보 제공에 동의하시겠습니까? (yes/no)"
read answer

if [ $answer = "y" ] || [ $answer = "yes" ]
then
echo "동의 처리되었습니다."
else
echo "동의 거부처리되었습니다."
fi
exit 0



(테스트 예제)
값을 입력받아 해당하는 파일이 존재하고, 
그 값이 파일일 경우에만 그 파일의 아래 3칸을 출력
그 값이 파일이 아니면 "파일이 아니다" 출력

gedit andor2.sh ▶

#!/bin/sh
echo "파일 명 입력 : "
read fname

if [ -e $fname  ] && [ -f $fname  ]  && [ -s $fname ]
then
tail -3 $fname
else
echo "존재하지 않습니다."
fi
exit 0

 



3. 반복문

1) for ~ in문
     for 변수 in 값1 값2 값3 .....
     do
          반복할 문장
     done

(테스트 예제)
gedit for1.sh ▶

#!/bin/sh
for i in a b c d e
do
echo "i = " $i
done

exit 0

▶ sh for1.sh ▶
i =  a
i =  b
i =  c
i =  d
i =  e


(테스트 예제) 1부터 10까지 합 
gedit for2.sh ▶

#!/bin/sh
sum=0
for i in 1 2 3 4 5 6 7 8 9 10
do
sum=`expr $sum + $i`
done

echo "1~10까지 합 : " $sum

exit 0

** 시퀀스
- ` seq 시작값 증감값 마지막값`

 


(테스트 예제) 1부터 10까지 합 
gedit for3.sh ▶

#!/bin/sh
sum=0
for i in ` seq 1 10`
do
sum=`expr $sum + $i`
done

echo "1~10까지 합 : " $sum

exit 0

 


(테스트 예제)  1부터 100사이의 값 중 홀수의 합
gedit for4.sh ▶

#!/bin/sh
sum=0
for i in ` seq 1 2 100`
do
sum=`expr $sum + $i`
done

echo "1~100사이의 수 중 홀수의 합 : " $sum
exit 0



(테스트 예제) 파라미터 값 입력하면 출력
gedit for5.sh ▶

#!/bin/sh
for a in $*
do
echo $a
done

exit 0



(테스트 예제) ls로 검색되는 파일명을 for문으로 가져와보기
ls -l for*.sh
gedit for6.sh ▶

#!/bin/sh
for fname in $(ls for*.sh)
do
echo "-------$fname-------"
head -5 $fname
done
exit 0



2) while문
   while [ 조건식 ]
       do
           반복할 문장
       done

(테스트 예제)
gedit for7.sh ▶

#!/bin/sh
while [ 1 ]
do
echo "우분투 리눅스 프로그램"
done

exit 0

▶ sh for7.sh ▶Ctrl + C 눌러서 종료

**

#!/bin/sh
while [ 1 ]
do
echo "우분투 리눅스 프로그램"
break
done
exit 0



(테스트 예제) 1~10 까지의 합
gedit while1.sh ▶

#!/bin/sh
sum=0
i=1
while [ $i -le 10 ]
do
sum=`expr $sum + $i`
i=`expr $i + 1`
done
echo "1~10까지 합 : " $sum
exit 0

▶ sh while1.sh 


(테스트 예제) 수 입력 받아서 1부터 그 수 까지 짝수의 합
gedit while2.sh  ▶

#!/bin/sh
sum=0
i=2
echo "수 입력 : "
read a
while [ $i -le $a ]
do
sum=`expr $sum + $i`
i=`expr $i + 2`
done
echo "짝수의 합 : " $sum
exit 0

▶ sh while2.sh


(테스트 예제) 입력값이 a1234일 때만 로그인, 아니면 계속 입력받기
gedit while3.sh ▶

#!/bin/sh
while [ 1 ]
do
echo "비밀번호 입력: "
read mypass
if [ $mypass = "a1234" ]
then
break
fi
echo "비밀번호가 틀렸습니다."
done
echo "로그인 성공"
exit 0

 


3) until문

- while문과 비슷하지만 조건이 참일 때까지 실행
- ; do 넣어도 안넣어도 같은 결과
gedit until1.sh ▶

#!/bin/sh
sum=0
i=1
until [ $i -gt 10 ] ; do
do
echo $i
i=`expr $i + 1`
done
exit 0


gedit until2.sh ▶

#!/bin/sh
sum=0
i=0
until [ $i -gt 9 ]
do
i=`expr $i + 1`
if [ $i = 5 ]
then
cnotinue
fi
echo $i
done
exit 0



(종합 테스트 예제) while, for, until 이용한 구구단 프로그램
1) for문
gedit ex1.sh ▶

#!/bin/sh
for i in `seq 1 9`
do
for j in `seq 1 9`
do
echo $i "*" $j = `expr $i \* $j`
done
done

exit 0


2) while문
gedit ex2.sh ▶

#!/bin/sh
i=1
while [ $i -le 9 ]
do
echo "-----$i단-----"
j=1
while [ $j -le 9 ]
do
echo $i "*" $j = `expr $i \* $j`
j=`expr $j + 1`
done
i=`expr $i + 1`
done
exit 0


3) until문
gedit ex3.sh ▶

#!/bin/sh
sum=0
i=2
until [ $i -gt 9 ] 
do
echo "-----$i단-----"
j=1
until [ $j -gt 9 ]
do
echo $i" * "$j" = "`expr $i \* $j`
j=`expr $j + 1` 
done
i=`expr $i + 1`
done
exit 0



(종합 테스트 예제) - 피보나치 수열의 위치를 입력받아 그 위치까지 출력시켜주는 프로그램
gedit ex4.sh ▶

#!/bin/sh
echo "피보나치수열의 위치 : "
read n
i=3
x=1
y=1
echo "피보나치 숫자"
echo $x
echo $y
while [ $i -le $n ]
do
z=`expr $x + $y`
echo $z
x=$y
y=$z
i=`expr $i + 1`
done

exit 0

4. 사용자 정의 함수

함수이름(){
내용
}
함수호출


(테스트 예제) 
gedit func1.sh  ▶

#!/bin/sh
myFunc() {
echo "함수 안에서 출력중"
return
}

echo "프로그램 시작"
myFunc
echo "프로그램 종료"

exit 0



(테스트 예제) 
gedit func2.sh  ▶

#!/bin/sh
myFunc() {
echo `expr $1 + $2`
}

echo "10 + 20 의 결과"
myFunc 10 20

exit 0



(테스트 예제) 
gedit func3.sh  ▶

#!/bin/sh
myFunc() {
echo `expr $1 + $2`
}

echo "첫번째 수 입력 : "
read su1
echo "두번째 수 입력 : "
read su2
myFunc  $su1 $su2

exit 0



(테스트 예제) 
gedit func4.sh  ▶

#!/bin/sh
myFunc() {
echo `expr $1 $2 $3`
}

echo "첫번째 수 입력 : "
read su1
echo "연산 입력 : "
read su2
echo "두번째 수 입력 : "
read su2
myFunc  $su1 $su2 $su3

exit 0



(테스트 예제) -- 피보나치 수열

#!/bin/sh
res=0
x=1
y=1
fivo(){
     if [ $1 -le 2 ]
     then
          res=1
     else
          res=`expr $x + $y`
     fi
}

echo "피보나치수열의 위치 : "
read n
i=1
echo "피보나치 숫자"
while [ $i -le $n ]
do
      fivo $i
      echo $res
      x=$y
      y=$res
      i=`expr $i + 1`
done

exit 0



(테스트 예제) 문자열로 만든 명령어의 실행
gedit eval.sh ▶

#!/bin/sh
str="ls -l if*.sh"
echo $str
eval $str

exit 0



(테스트 예제) 날짜 출력
gedit set.sh ▶

#!/bin/sh
echo "오늘 날짜는 $(date) 입니다."
set $(date)
echo "오늘은 $1 년입니다."
echo "오늘은 $2 월입니다."
echo "오늘은 $3 일입니다."
echo "오늘은 $4 요일입니다."
echo "오늘은 $5 시간입니다."
exit 0

 


(테스트 예제) 지역변수와 외부변수의 출력
gedit exp1.sh  ▶

#!/bin/sh
echo $var1
echo $var2
exit 0

 

gedit exp2.sh  ▶

#!/bin/sh
var1="지역변수"
var2="외부변수"
sh exp1.sh
exit 0

▶ sh exp2.sh
>> 아무것도 안나옴. exp2의 var값이 exp1의 var값에 영향 안줌.

gedit exp2.sh  ▶

#!/bin/sh
export var1="지역변수"
export var2="외부변수"
sh exp1.sh
exit 0

▶ sh exp2.sh
>> exp2의 var 값이 exp1의 var 값에 영향을 줘서 출력이 됨


(테스트 예제) printf
gedit printf.sh ▶

#!/bin/sh
var1=100.4
var2="안녕하세요 우분투 리눅스 입니다"
printf "%5.2f \n\n \t %s \n" $var1 "$var2"
exit 0



(테스트 예제) shift
gedit shift.sh ▶

#!/bin/sh
myfunc(){
str=""
while [ "$1" != "" ]
do
str="$str $1"
shift
done
echo $str
}

myfunc aaa bbb ccc ddd eee

exit 0



+ Recent posts