반응형

작성일자 : 2021.03.06

환경 : Spring Boot 2.1.6, Gradle

 

 

1. 의존성 추가

 

build.gradle

implementation 'org.apache.tomcat.embed:tomcat-embed-jasper'

 

 

2. jsp 설정 추가

 

application.properties

spring.mvc.view.prifix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp

 

 

3. Controller 생성

 

JspController.java

@Controller
public class JspController {
    @GetMapping("/index")
    public String getIndex(){
        return "index";
    }
}

 

 

4. jsp 파일 생성

 

생성 경로 : src/main/webapp/WEB-INF/jsp/

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    </head>
    <body>
        <div>JSP</div>
    </body>
</html>




5. 확인

 

 

반응형

'Java > 예제코드' 카테고리의 다른 글

[java] 소수점 표현 예제  (0) 2021.02.27
[Spring] 파일 업/다운로드 예제 코드  (0) 2021.02.20
반응형

Servlet

클라이언트의 요청을 처리하고 그 결과를 반환하는 자바 웹 프로그래밍 기술로 Servlet 클래스로 구현되어있다.

 

Servlet Container (Web Container)

Servlet, JSP 를 실행할 수 있는 소프트웨어 (Tomcat 등)을 의미함. 요청이 들어올 때마다 새로운 자바 스레드를 만들고 HttpServletRequest 와 HttpServletResponse 객체를 생성해 관리하며 알맞은 JSP 파일을 서블릿 파일로 변환한 뒤 컴파일하여 이것을 실행한 결과를 반환한다.

반응형

'Java > Basic' 카테고리의 다른 글

String / StringBuffer / StringBuilder  (0) 2020.10.02
다형성 / 오버로딩 / 오버라이딩  (0) 2020.10.02
추상클래스 / 인터페이스  (0) 2020.09.30
클래스 / 오브젝트 / 인스턴스  (0) 2020.09.26
반응형

자바스크립트에서 함수를 생성하는 방식에는 표현식과 선언식 두 가지 방법이 존재한다. 함수 선언식은 호이스팅에 영향을 받지만, 함수 표현식은 익명 함수를 통해 함수를 표현하기 때문에 호이스팅에 영향을 받지 않는다. 클로저나 콜백으로 쓰기 좋음.

 

호이스팅?
자바스크립트가 함수를 실행할 때, 함수 안에 있는 선언들을 모두 끌어올려서 해당 함수 유효 범위의 최상단에 선언하는 것. var 변수, 선언식으로 선언된 함수가 영향을 받음

 

 

함수 선언식

function 함수명() {
  구현 로직
}

 

 

함수 표현식

var 함수명 = function () {
  구현 로직
};
반응형

'용어 정리' 카테고리의 다른 글

익명 함수 / 일급 객체  (0) 2021.03.09
상수 / 리터럴  (0) 2021.03.09
ECMAScript / JavaScript  (0) 2021.02.11
코딩 스타일  (0) 2019.09.07
J2SE/J2ME/J2EE  (0) 2018.04.22
반응형

작성일자 : 2021.02.27

 

객체지향 프로그래밍(Object-Oriented Programing)

 

객체지향 프로그래밍(Object-Oriented Programing)이란?

 

객체 지향 프로그래밍은 컴퓨터 프로그래밍 패러다임중 하나로, 프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다. 말 그대로 객체를 중심으로 프로그래밍을 하는 것.

 

객체란?
사물, 개념 등의 현실의 객체를 추상화 혹은 은유하여 소프트웨어 세상에서 재창조한 것
객체의 특징
OOP의 주요 개념은 시스템을 상호작용하는 자율적인 객체들의 공동체로 바라보며, 객체를 이용해 시스템을 분할하는 것이다. 여기서 자율적인 객체란 상태와 행위를 함께 지니고 스스로 자기 자신을 책임지는 객체를 의미한다. 어떠한 객체의 책임의 집합이 그 객체의 역할이 되며, 시스템의 행위를 구현하기 위해 객체는 다른 객체와 협력한다.

 

객체지향 프로그래밍의 장/단점

 

장점

  • 코드 재사용이 용이
  • 유지보수가 쉬움
  • 대형 프로젝트에 적합

 

단점

  • 처리속도가 상대적으로 느림
  • 객체가 많으면 용량이 커질 수 있음
  • 설계 시 많은 시간과 노력 소요

 

객체지향의 4대 특징

 

캡슐화 (Encapsulation)

  • 객체의 정보를 숨기고 외부에서 인터페이스를 통해서만 접근이 가능하도록 설계하는 것 (접근 제어 지시자, Access Specifiers)
  • 단순히 private으로 설정해놓고 getter, setter를 제공한다면 이는 캡슐화가 아니다. 변할 수 있는 어떤 것이라도 감추어 응집도는 높게, 결합도는 낮게하고 내부 구현의 변경이 있더라도 외부의 객체는 영향이 없도록 하는 것이 캡슐화이다.

상속성 (Inheritance)

  • 기존 객체를 재사용하여 조상과 자손 관계의 새로운 객체를 설계하는 것. 상속받은 자손 객체는 조상 객체의 모든 멤버를 사용할 수 있다. (extends, overriding)

추상화 (Absctraction)

  • 불필요한 부분은 빼고 필요한 핵심적인 개념 또는 기능만을 추려 표현하는 행위 (abstract, 객체 설계)

다형성 (Polymorphism)

  • 서로 다른 유형의 객체가 동일한 메시지에 대해 서로 다르게 반응하는 것. 즉 서로 다른 타입에 속하는 객체들이 동일한 메시지를 수신할 경우 서로 다른 메서드를 이용해 메시지를 처리할 수 있는 메커니즘 (overloading, List -> ArrayList 관계)

 

 

객체지향의 설계 

 

SOLID 원칙을 지키며 적절한 협력, 책임, 역할을 가지는 객체를 설계하여 OOP 패러다임을 올바르게 실현하는 것

 

 

객체지향 설계 주요 개념

 

SOLID(5대 원칙)

  • 단일 책임 원칙 ( Single Responsiblility Principle )
    • 객체는 단 하나의 책임 혹은 목적만 가져야 함
  • 개방/폐쇄 원칙 ( Open Closed Principle )
    • 객체가 확장에는 개방되어 있고, 변경에는 닫혀있어야 함.
    • > 새로운 기능을 제공하기 위해서 기존 클래스를 수정하는 것을 허용하거나 권장하지 말고 기존 클래스를 확장하는 방법을 찾아야 한다는 것을 의미
  • 리스코프 치환 원칙 ( Liskov Substitution Principle )
    • 한 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 치환이 가능해야 함.
    • > 상위 타입의 객체를 하위 타입의 객체로 치환해도 상위 타입을 사용하는 프로그램은 정상적으로 동작해야 함을 의미
  • 인터페이스 분리 원칙 ( Interface Segregation Principle )
    • 클라이언트가 사용하지 않는 메서드에 대해서는 의존하지 않아야 함
    • > 범용 인터페이스 하나를 사용하기보다는, 특정 클라이언트에 특화되도록 인터페이스 여러 개로 분리해야 함을 의미
  • 의존 역전 원칙 ( Dependency Inversion Principle )
    • 상위 계층이 하위 계층에 의존하는 전통적인 의존 관계를 역전시킴으로써 상위 계층이 하위 계층의 구현으로부터 독립되게 할 수 있다.
    • > 의존관계를 맺을 때 변화하기 쉬운 것(구체적인 것)보다는 변화하기 어려운 것(추상적인 것)에 의존해야 함을 의미. Strategy 디자인 패턴 참고

객체 요소

  • 협력
    • 스스로 해결하기 어려운 문제를 해결하기 위해 다른 객체의 도움을 구하는 것. 객체는 메시지를 통해 또 다른 객체에게 도움을 요청하고, 요청을 받은 객체는 필요한 도움을 메시지의 형태로 응답한다. 이것이 협력의 과정이며 이때 두 객체는 협력의 관계에 있다고 표현한다. (객체 간 메시지 송수신 과정)
  • 책임
    • 어떤 협력에 참여하여 적절한 행동을 할 의무가 있는 경우 해당 객체가 책임을 가진다고 표현하다. (인터페이스 구현체, 객체의 메서드)
  • 역할
    • 어떤 협력안에서 책임의 집합을 역할이라고 한다. 한 역할 안에는 하나 이상의 책임이 존재한다. (인터페이스)

 

소프트웨어 설계에 법칙이란 존재하지 않는다. 법칙에는 예외가 없지만 원칙에는 예외가 넘쳐난다. 초보자는 원칙을 맹목적으로 추종한다. 심지어 적용하려는 원칙들이 서로 충돌하는 경우에도 원칙에 정당성을 부여하고 억지로 끼워맞추려고 노력한다. 원칙이 현재 부적합하다고 판단된다면 과감하게 원칙을 무시하라. 
- 오브젝트 中 -

 

Reference

객체지향의 사실과 오해 - 조영호

오브젝트 - 조영호

반응형

'이론 정리' 카테고리의 다른 글

SAGA 패턴  (0) 2023.08.22
Blocking/Non-blocking, Sync와 Async: 개념과 예시  (0) 2023.08.17
한글 인코딩  (0) 2019.06.04
가상화 ( IO )  (0) 2018.02.11
가상화 ( 서버 )  (0) 2018.02.11
반응형
System.out.println(a);                              
// 결과 : 0.987654321

System.out.println(Math.ceil(a * 100) / 100.0);     
// 결과 : 0.99

System.out.println(Math.round(a * 100) / 100.0);    
// 결과 : 0.

System.out.println(Math.floor(a * 100) / 100.0);    
// 결과 : 0.98

System.out.println(String.format("%.3f", a));       
// 결과 : 0.988

 

반응형

'Java > 예제코드' 카테고리의 다른 글

[Spring] JSP 설정  (0) 2021.03.06
[Spring] 파일 업/다운로드 예제 코드  (0) 2021.02.20
반응형

작성일자 : 2021.02.20

환경 : 자바8, Spring Boot 2, Chrome

1. 파일 업로드

 

HTML Code

...
  <form method="post" action="/uploadFile" enctype="multipart/form-data">
      <input type="file" name="file">
      <input type="submit">
  </form>
...

 

* submit 대신 Javascript 를 활용할 경우

 

...
	<form method="post" action="/uploadFile" enctype="multipart/form-data">
		<input type="file" name="file">
	</form>
	<button onclick="sendFile()">button</button>
...

<script>
    const sendFile = () => {
        const formElement = document.querySelector("form");
        const request = new XMLHttpRequest();
        request.open("POST", "/uploadFile");
        request.send(new FormData(formElement));
    }
</script>

 

 

Java code

@PostMapping("/uploadFile")
public void uploadFile(@RequestParam("file") MultipartFile file){
    // 파일 기본 정보
    System.out.println("file name : " + file.getOriginalFilename());
    System.out.println("file size : " + file.getSize());

    try(
    	// 프로젝트 폴더에 temp.jpg 이름으로 파일 생성
        FileOutputStream fos = new FileOutputStream("./temp.jpg"); 
        InputStream is = file.getInputStream()
    ){
        int readCount;
        byte[] buffer = new byte[1024];
        
        // 데이터 쓰기
        while((readCount = is.read(buffer)) != -1){
            fos.write(buffer, 0, readCount);
        }
    }catch(Exception e){
        e.printStackTrace();
    }
}

 

 

2. 파일 다운로드

Java code

@GetMapping("/downloadFile")
public void downloadFile(HttpServletResponse response) {

	// 프로젝트 폴더의 temp.jpg 파일 로드
	String fileName = "temp.jpg";
	File file = new File("./" + fileName);

	// 클라이언트에서 아래의 이름으로 파일이 받아진다.
	String newFileName = "newTemp.jpg";

    try (
        FileInputStream fis = new FileInputStream(file);
        BufferedInputStream bis = new BufferedInputStream(fis);
        OutputStream out = response.getOutputStream()
    ){
    	// 응답이 파일 타입이라는 것을 명시
        response.addHeader("Content-Disposition", "attachment;filename=\""+newFileName+"\"");
        // 응답 크기 명시
        response.setContentLength((int)file.length());

        int read = 0;
        
        // 실제 데이터 전송
        // OutputStream 의 Deafult 버퍼 사이즈는 8192 Byte
        // 이 루프를 8000 번 정도 돌때마다 약 8KB 정도의 데이터가 전송 
        while((read = bis.read()) != -1) {
            out.write(read);
        }
        
    } catch(IOException e) {
        e.printStackTrace();
    }
}

 

---

 

* HTTP MultiPart 로 파일 전송시 formData 에서 확인이 불가능, 단 파일을 null 로 전달하면 확인 가능 (크롬 기준)

 

* form 에서 지정하는 enctype 속성은 아래 세가지의 값으로 지정될 수 있다.

 

1. application/x-www-form-urlencoded

디폴트 값. 폼데이터는 서버로 전송되기 전에 URL-Encode 됨

 

2. multipart/form-data

파일이나 이미지를 서버로 전송할 경우

 

3. text/plain

인코딩을 하지 않은 문자 상태로 전송

 

반응형

'Java > 예제코드' 카테고리의 다른 글

[Spring] JSP 설정  (0) 2021.03.06
[java] 소수점 표현 예제  (0) 2021.02.27
반응형

작성일자 : 2021.02.12

시나리오 : MyBatis 를 사용하여 DB 데이터를 조회할 때 1:M 관계를 가지는 데이터를 List 형태로 조회

환경 : Spring Boot, mybatis-spring-boot-starter 1.3.2

 

 

1. 조회 데이터 정의

 

Parent(1) : Child(M) 구조의 테이블 정의

 

1개의 Parent 데이터와, Parent 와 식별관계를 가지는 2개의 Child 데이터를 저장. Child 는 Parent 의 id 를 FK 로 가짐

 

 

2. 설정

 

* resultMap 을 활용

In Mapper.xml

<resultMap id="parentResultType" type="com.example.demo.Parent">
    <id column="PK 칼럼명" property="멤버 변수명"/>
    <result column="칼럼명" property="멤버 변수명"/>
    <collection property="childList" resultMap="childList"/>
</resultMap>

<resultMap id="childList" type="com.example.demo.Child>
    <id column="PK 칼럼명" property="멤버 변수명"/>
    <result column="칼럼명" property="멤버 변수명"/>
    <result column="칼럼명" property="멤버 변수명"/>
</resultMap>

<select id="selectId" resultMap="parentResultType">
   ...
</select>

 

Mapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.example.demo.TestMapper">
  
  <resultMap id="parentResultType" type="com.example.demo.Parent">
    <id column="parentId" property="id"/>
    <result column="parentValue" property="value"/>
    <collection property="childList" resultMap="childList"/>
  </resultMap>
  
  <resultMap id="childList" type="com.example.demo.Child">
    <id column="childId" property="id"/>
    <result column="parentId" property="parentId"/>
    <result column="childValue" property="value"/>
  </resultMap>

  <select id="selectParentList" resultMap="parentResultType">
    SELECT
      t1.id AS parentId
      , t1.value AS parentValue
      , t2.id AS childId
      , t2.value AS childValue
    FROM
      parent t1
    LEFT JOIN child t2
    ON t1.id = t2.parentId
  </select>
  
</mapper>

 

Parent.java

public class Parent {
    String id;
    String value;
    List<Child> childList = new ArrayList<>();
}

 

Child.java

public class Child {
    Integer id;
    Integer parentId;
    String value;
}

 

 

3. 확인

 

Mapper 에서 정의한 selectParentList 쿼리를 사용하여 1. 의 환경의 DB 에서 조회할 경우,

 

- 실제 쿼리 조회 내용

 

- 조회한 데이터 내용

 

중복이 제거되고 childList 형태의 멤버 변수가 조회됌 

반응형

'Java' 카테고리의 다른 글

[Spring] Profile 기준 Property 구분 적용  (0) 2023.06.28
[SpringBoot] Gradle 변수 Property 활용  (0) 2022.05.30
[Spring] Web Cache 적용  (0) 2020.12.19
[SpringBoot] H2 연동  (0) 2020.07.21
[Spring] App 구동 후 자동 작업 실행  (0) 2020.02.23
반응형

ECMAScript (ECMA-262)

ECMA 인터내셔널이 제정한 ECMA-262 기술 규격에 의해 정의된 범용 스크립트 언어

ECMAScript 6 는 ECMA-262 표준의 제 6판을 의미(ES6, ES2015, ECMAScript2015 랑 동일한 의미)

 

 

 

JavaScript

ECMAScript 명세 혹은 사양을 준수하는 범용 스크립팅 언어

 

 

reference

wormwlrm.github.io/2018/10/03/What-is-the-difference-between-javascript-and-ecmascript.html

반응형

'용어 정리' 카테고리의 다른 글

상수 / 리터럴  (0) 2021.03.09
함수 표현식 / 함수 선언식  (0) 2021.03.05
코딩 스타일  (0) 2019.09.07
J2SE/J2ME/J2EE  (0) 2018.04.22
CPU/Core/Processor  (0) 2018.04.07
반응형

 

SelectBox 선택한 항목의 innerText 조회

 

const selectBoxElement = document.getElementById('selectBoxId');
const innerText = selectBoxElement .options[selectBoxElement .selectedIndex].text;

 

반응형

'Javascript' 카테고리의 다른 글

화살표 함수  (0) 2021.03.10
[Vue] 컴포넌트간 데이터 통신  (0) 2020.09.11
[vue] vue-router 사용  (0) 2020.09.08
[Vue] Component 사용  (0) 2020.09.06
[Vue] Vue Project 생성  (0) 2020.09.03
반응형

작성일자 : 2020.01.24

환경 : CentOS 7, Apache 2.2 ,Tomcat 7, OpenSSL 1.0.2

시나리오 : 서비스 서버를 인증서버로 활용하여 Apache Web Server, Tomcat WAS 에 각각 SSL 적용

 

 

1. 인증서 만들기 (OpenSSL 활용)

 

OpenSSL 설치

> yum install openssl -y

 

OpenSSL 설치 확인

> openssl version

  

 

인증기관(CA) 개인 키 발급

> openssl genrsa -des3 -out server.key 1024

  

발급 과정 중 개인키 패스워드 지정 필요.

자가 서명이기에 내 자신이 인증기관이며, 개인 키 생성이 인증기관 개인 키 발급하는 과정이 된다

 

 

csr (Certivicate Sinning Request - 인증요청서) 생성

> openssl req -new -days 365 -key server.key -out ssl.csr

 

앞에서 지정한 패스워드 입력 필요

정보 입력 부분은 전부 Default 로 진행

 

 

인증서 (crt : Cretificate) 생성

> openssl x509 -req -days 365 -in ssl.csr -signkey server.key -out ssl.crt

  

 

 

2.1) Case1 : Apache SSL 적용

 

mod_ssl.c 모듈 확인

%APACHE_HOME%/bin/ > ./apachectl -l 

  

 

mod_ssl.c 가 없다면 apache 설치 과정에서 추가하거나, 동적으로 적용해야함

apache 설치 중 ./configure --enable-ssl 명령어를 통해 해당 모듈 사용 설정 가능

 

* ssl 모듈 추가 설정 후 설치 진행 과정에서 아래와 같은 에러 발생 시, openssl-devel 추가 설치

  

 

> yum install openssl-devel -y

 

 

Apache 설정

 

SSLCertificateFile 인증서 파일 설정

SSLCertificateKeyFile 키 파일 설정

SSLCACertificateFile 는 설정하지 않아도 동작한다. 진행하는 테스트 환경은 자가 서명이라 체이닝이 필요 없기 때문일듯(추측..)

 

%APACHE_HOME%/conf/extra/httpd-ssl.conf

SSLCertificateFile "path"
SSLCertificateKeyFile "path"
# SSLCACertificateFile "path" // 체이닝이 필요할 경우 설정

  

 

 

%APACHE_HOME%/conf/httpd.conf

Include conf/extra/httpd-ssl.conf

  

SSL 설정파일을 포함하는 설정

 

 

Apache 시작

 

시작 시 앞에서 설정했던 키 패스워드 입력

 

 

HTTPS(SSL) 적용 확인

 

http 접근 시

 

https 접근 시

신뢰할 수 없는 인증서이기에 처음엔 위 처럼 뜬다

무시하고 접근 가능

 

 

 

2.2 Case 2 : Tomcat SSL 적용

 

인증서를 tomcat 용으로 변환

> openssl pkcs12 -export -in ssl.crt inkey server.key -out .keystore -name tomcat

   

변환 과정에서 key 패스워드 입력 및 keystore 패스워드 지정 필요

 

 

tomcat 설정

 

%TOMCAT_HOME%/conf/server.xml

server.xml 에 아래 설정 기본 옵션이 주석처리되어 적혀있음

<Connector port="%PORT_NUMBER%" protocol="org.apache.coyote.http11.Http11Protocol" maxThreads="150" SSLEnabled="true" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystorePass="%PASSWORD%" keystoreFile="%KEYSTORE_FILE_PATH%"/>

  

 

HTTPS(SSL) 적용 확인

http 8080 접근 시

https 8443 접근 시

 

 

 

3. 인증서 정보

 

 

반응형

'보안' 카테고리의 다른 글

[보안] SSL  (0) 2021.01.24
[보안] 암호화  (0) 2021.01.17

+ Recent posts