Base64의 정의 

Base64 인코딩 표

 

Base64란, 바이너리 데이터를 ASCII 문자열로 전환하기 위한 인코딩 중 하나입니다. 

 

보통은 바이너리 데이터로 표현되는 실행 파일 등을 전송하는 데 Base64 방식을 이용하여 작업합니다. 

 

또한 클라이언트-서버 단에 전송되는 데이터 타입을 통일하여 데이터타입을 잘못 입력하여 발생하는 문제를 방지하거나 

 

요청-응답에 대해 Filter단에서 문자열 치환- XSS 방지 기능을 거칠 경우 Base64를 통해 우회하기도 합니다. 

 

Javascript Base64 인코딩-디코딩 

 

Javascript에서는 전역객체 window의 btoa() , atob() 함수를 이용해 Base64 인코딩-디코딩 기능을 사용할 수 있습니다. 

 

btoa() 함수를 사용할 때는, 인코딩 방식에 주의하여 사용해야 합니다. 

 

MDN의 btoa() 함수에 대한 설명을 보면, Javascript String 객체를 기준으로 설계되어 있기 때문에 

하나의 문자열이 1Byte를 넘는 경우 ( 이모지 등 ) 에러가 발생합니다. 

 

이때는 해당 문자열을 Javascript String 기준의 UTF-16에 맞추어 변환시켜주어야 합니다. 

 

Java Base64 인코딩-디코딩 

Java는 java.util 패키지에 Base64 클래스를 제공합니다. 

 

Nested Class(내부클래스)로 Base64.encoder, Base64.decoder를 제공합니다. 

 

java.net의 urlDecoder 역시 base64 형태로 보내진 URL을 UTF-8 등으로 디코딩할 수 있습니다.

 

 

 

여러분도 Javascript의 btoa(), atob(), 

 

Java의 java.util.Base64 Class를 이용하여 바이너리 데이터를 전송해보시기 바랍니다. 

 

 

 

참고자료 

 

Java Document, Java.util.Base64 :  https://docs.oracle.com/en/java/javase/15/docs/api/java.base/java/util/Base64.html

 

Base64 (Java SE 15 & JDK 15)

public class Base64 extends Object This class consists exclusively of static methods for obtaining encoders and decoders for the Base64 encoding scheme. The implementation of this class supports the following types of Base64 as specified in RFC 4648 and RF

docs.oracle.com

 

MDN, btoa()  :  https://developer.mozilla.org/en-US/docs/Web/API/btoa

 

btoa() - Web APIs | MDN

The btoa() method creates a Base64-encoded ASCII string from a binary string (i.e., a string in which each character in the string is treated as a byte of binary data).

developer.mozilla.org

 

MDN, Base64  : https://developer.mozilla.org/en-US/docs/Glossary/Base64

 

Base64 - MDN Web Docs Glossary: Definitions of Web-related terms | MDN

Base64 is a group of similar binary-to-text encoding schemes that represent binary data in an ASCII string format by translating it into a radix-64 representation. The term Base64 originates from a specific MIME content transfer encoding.

developer.mozilla.org

 

Redis란? 

레디스는 2009년 최초 출시되었습니다.

 

Redis는 대표적인 오픈소스 인-메모리(In-Memory) 데이터베이스입니다. 

  

  Redis는 인-메모리(In-Memory) 데이터베이스의 정의에 의거하여

 외부 저장장치에 데이터를 보관하는 기존의 데이터베이스와는 달리

 휘발성 메모리에 저장하여 데이터 접근속도를 더 빠르게 만듭니다. 

장치가 꺼질 경우 사라지는 메모리를 사용하기 때문에 서비스의 모든 데이터를 저장하기는 어렵습니다.

 

 

공식 홈페이지에 따르면

다른 인메모리 데이터베이스와 달리 많은 데이터 자료형을 지원하며 

  기존의 데이터베이스와 유사한 쿼리문, 서브쿼리문 형태로도 데이터조회가 가능하다고 합니다. 

 

 

  

 

Redis의 기능 

 

  • 데이터베이스를 복제하여, 데이터 부하를 줄이고 장애 발생 시 서비스를 계속 제공할 수 있습니다. 
  • 세션(Session)에 저장된 데이터와 같은 데이터를 다른 WAS(Web Application Server)와 공유할 수 있습니다. 
  • 빠른 속도, 많은 자료형, 정렬 기능 등으로 간단한 데이터 제공의 경우 쾌적한 사용자 환경을 유지할 수 있습니다. 

 

Redis Stack

Redis는 여러 모듈들을 단일 기능으로 통합한 어플리케이션을 제공하고 있습니다. 

 

공식 홈페이지에는 Redis-Stack과 연동될 수 있는 대표적인 기술들을 소개하니 참고하시면 좋을 것 같습니다. 

 

참고 자료 

 

Redis 공식 소개 홈페이지 

https://redis.io/

 

Redis

Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache, and message broker

redis.io

객채지향 프로그래밍 OOP(Object Oriented Programming)의 정의 


객채지향은 현실을 “객채(Object)”들의 상호작용으로 구현한 프로그래밍 방법론입니다. 

 

객채지향의 장점으로는 세 가지를 꼽을 수 있습니다. 

 

첫째, 재사용성입니다. 

중복된 코드와 개념을 묶어 쉽게 재사용할 수 있습니다. 

 

둘째, 코드관리의 용이성입니다. 

코드변경 시 관리가 쉽습니다. 

 

셋째, 코드의 신뢰성이 높습니다. 

실수할 가능성이 줄어들고, 실수하더라도 빠르게 수정할 수 있습니다. 

 

 

객채(Object) 의 정의 


이러한 장점을 가진 객채지향 방법론으로 우리의 코드를 설계하려면, 가장 중요한 개념인 객체에 대해 알아야 합니다. 

 

객체란, 보통 현실의 사물을 속성(Variable)기능(Method)으로 묘사한 프로그래밍에 쓰이는 가상의 사물입니다. 

 

이 말을 좀 더 쉽게 이해하기 위해서, 자동차에 대한 예시를 통해 현실 사물이 어떻게 객체가 되는지 쉽게 묘사해 봅시다. 

 

"자동차" 라는 물건은 여러 속성(특징)을 가지고 있습니다. 

 

주인이 붙여준 이름이 있을 것이고, 차의 브랜드가 있을 것이고, 차주의 이름, 차의 색깔도 있겠군요. 

 

"자동차"의 기능은 어떤가요? 

 

자동차는 "도로를 달리고", 좋은 자동차라면 "자동주행 기능을 켜고", 브레이크로 "멈춰서고", "주차하고".. 

 

다 나열하기 힘들 정도로 수많은 기능이 있겠군요. 

 

이렇듯이 자동차를 "속성"과 "기능"으로 단순화해서 바라보면 "객채" 가 됩니다. 

 

이런 객채들을 활용하여 프로그램을 만들어 보는 것이 객채지향 프로그래밍입니다. 

 

객채지향 설계의 장점 실습해보기


그렇다면 객체 지향적인 설계와 비객채지향적 설계의 차이점은 무엇일까요? 

 

먼저 자동차를 타고 달리고, 자동주행하고, 멈춰서고, 주차하는 현실의 행위를 Java 코드로 구현해봅시다. 

 

// 서울에서 차를 타고 달리는 상황을 가정하여, 이름을 
// DriveCarInSeoul로 지어봅시다. 
public class DriveCarInSeoul {
 
 	//main이라고 하는 메서드를 통해서 상황을 실행시켜 볼 수 있습니다.
 	public static void main(String[] args) {
    	
            // 자동차의 속성(특징) 묘사하는 변수를 만듭니다.
            // 이름, 브랜드, 주인, 색깔.. 원하는 속성(특징)은 몇 개든 묘사할 수 있습니다!
            String name = "부릉이"; 
            String brand = "현대자동차";
            String owner = "고길동"; 
            String color = "빨간색"; 
            ...

            // 자동차의 기능을 묘사하는 메서드를 만듭니다.
            // 달린다, 자동주행, 멈춰선다, 주차한다, 원하는 기능은 몇 개든 묘사할 수 있습니다!!

            // 앞서 만든 특징들을 활용하여 달리는 상황을 묘사할 수 있습니다. 
            // 어떤 주인이 무슨 브랜드의 차를 모는지를 묘사합니다. 
            System.out.println(owner + "drives" + brand); 


            // 이 기능은 오토파일럿 기능이 실행됨을 묘사합니다.
            System.out.println(name + " autopilot activated"); 

            // 이 기능은 차의 색깔과 차가 멈추었다는 것을 묘사합니다. 
            System.out.println(color + " car stopped"); 


            // 이 기능은 차가 주차되었음을 묘사합니다.
            System.out.println(name + " car parked"); 
    	}
 
}

 

 

이제 여러분은 Java라는 언어로, 서울에서 차를 모는 과정을 멋지게 시뮬레이션 할 수 있습니다!

 

그런데, 차는 서울에서만 몰 수 있을까요? 부산, 강릉, 광주, 춘천.. 어디든 갈 수 있죠.

 

이번에는 부산에서도 차를 몰아봅시다. 역시 차는 달리고, 자동주행하고, 멈춰서고, 주차합니다. 

 

// 이름을 DriveCarInBusan으로 짓는다면 부산에서 차를 모는 과정을 
// 시뮬레이션 할 수 있습니다.

public class DriveCarInBusan {
 
 	//main이라고 하는 메서드를 통해서 상황을 실행시켜 볼 수 있습니다.
 	public static void main(String[] args) {
    	
        	// 자동차의 속성을 먼저 묘사합니다.
            String name = "부릉이"; 
            String brand = "현대자동차";
            String owner = "고길동"; 
            String color = "빨간색"; 
            
            // 이후 자동차가 달리고, 자동주행하고, 멈추고, 주차하는 과정을 묘사합니다.
            System.out.println(owner + "drives" + brand); 
            System.out.println(name + " autopilot activated"); 
            System.out.println(color + " car stopped"); 
            System.out.println(name + " car parked"); 
    	}
 
}

 

아주 간단하게, 우리는 성공적으로 차를 몰고, 부산에서 달리고, 자동주행하고, 멈추고, 주차에 성공했습니다!

 

그런데 하필, 차 주인인 고길동 아저씨가 이번에는 한국의 모든 도시를 돌아보고 싶다고 말하는군요. 

 

시군구의 "시"만  포함하더라도 80개가 넘으니, 80번 넘게 제일 위쪽의 이름을 바꿔  그 안에 같은 코드를 열심히 붙여넣어야 끝납니다.

 

이번에는 80개의 도시를 "파란색" 차로 돌아보고 싶다고 말하는군요. 

 

80개의 도시 이름을 일일히 찾아서, 모든 차의 color 변수를 "파란색" 으로 바꿔줘야 합니다. 

 

심지어 아저씨는 멋지게 "드리프트" 하는 기능도 익혔습니다, 이제 차는 달리고, 자동주행하고, 드리프트하고, 멈추고, 주차합니다! 

 

또 80개를 일일히 찾아서, "드리프트" 기능을 넣어주면 되겠군요. 

 

어찌저찌 80개를 열심히 수정해서 끝냈다고 칩시다, 이제는 해외 도시를 "붕붕이"라는 차로 돌아보고 싶다고 한다면 어떨까요? 

 

해외의 도시는 1만개가 넘으니, "붕붕이"로 바뀐 코드를 열심히 1만번 붙여넣으면 됩니다! 

 

이 다음 한번이라도 더 이름을 바꾼다면 아마 손가락이 먼저 부러질 것 같네요. 

 

 

그럼 우리의 손가락이 부러지기 전에, 이 자동차"속성"과 "기능"을 빼내서 가상의 "객채"로 묶어봅시다.

 

		
        // Car 라고 하는 "객채"로 속성과 기능을 묶었습니다.
        public Class Car() {
        
            // 자동차의 속성을 묘사합니다.
            String name = "부릉이"; 
            String brand = "현대자동차";
            String owner = "고길동"; 
            String color = "빨간색"; 
            
            // 이후 자동차가 달리고, 자동주행하고, 멈추고, 주차하는 과정을 묘사합니다.
            public void driveTheCar() {
            System.out.println(owner + "drives" + brand); 
            System.out.println(name + " autopilot activated"); 
            System.out.println(color + " car stopped"); 
            System.out.println(name + " car parked"); 
            }
    	}

 

이렇게 하면 안에 있는 "속성"과 "기능"을 붙여넣을 필요 없이, 이 "자동차"를 부르기만 하면 됩니다.

 

// 이제 서울부터 뉴욕까지, 같은 자동차로 언제나 달릴 수 있습니다.

// 서울에서,
public class DriveCarInSeoul {
	public static void main(String[] args) {
	Car car = new Car(); 
    car.driveTheCar();
    }
}

// 부산에서, 
public class DriveCarInBusan {
	public static void main(String[] args) {
	Car car = new Car(); 
    car.driveTheCar();
    }
} 
// 인천에서,
public class DriveCarInIncheon {
	public static void main(String[] args) {
	Car car = new Car(); 
    car.driveTheCar();
    }
} 
// 춘천에서,
public class DriveCarInChunCheon {
	public static void main(String[] args) {
	Car car = new Car(); 
    car.driveTheCar();
    }

} 
// 도쿄에서, 
public class DriveCarInTokyo {
	public static void main(String[] args) {
	Car car = new Car(); 
    car.driveTheCar();
    }
} 
// 나가사키에서,
public class DriveCarInNagasaki {
	public static void main(String[] args) {
	Car car = new Car(); 
    car.driveTheCar();
    }
} 
// 뉴욕에서,
public class DriveCarInNewYork {
	public static void main(String[] args) {
	Car car = new Car(); 
    car.driveTheCar();
    }
}

... (생략)

 

이제 훨씬 더 간결한 코드 몇줄만으로도 우리가 만든 멋진 차의 "속성"과 "기능"을 그대로 다시 사용할 수 있습니다.

 

이처럼 객채지향적 코드는 재사용성이 뛰어납니다.

 

또, 차의 색깔이 바뀌더라도 1만번 다시 붙여넣는 대신 단 한번, Car이라는 객체의 color를 바꿔주면 됩니다. 

 

코드를 고치거나 바꾸는 유지보수도 용이합니다.

 

졸다가 두 번 붙여넣는다 해도 걱정없습니다, 1만 개의 코드를 다 점검할 필요 없이 하나의 "객체"에 두 번 들어갔는지만 확인하면 됩니다. 

 

오탈자의 위험성도 낮아지고, 구현된 기능에 대한 신뢰성이 높은 코드가 되었습니다. 

 

 

 

이처럼 객체지향 언어는 그 뛰어난 재사용성, 유지보수 용이성, 신뢰성으로 현재 널리 쓰이는 대표적인 프로그래밍 언어가 되었습니다. 

 

Java 코드를 해석하고 구현할 때, 이 세 가지 장점들을 고려하면서 구현한다면 

 

훨씬 빠르고, 쉽게 고칠 수 있고, 믿음직한 코드가 될 것입니다. 

 

Java 언어로 코드를 구현할 때는 이런 객채지향 언어의 장점을 고려하여 자신의 코드를 구현해 보시기를 바랍니다.

 

SmallTalk 알아보기 

 

객채지향 언어를 이야기 할 때 빠지지 않고 등장하는 것이 언어 SmallTalk 입니다. 

 

GNU의 GNU SmallTalk User's Guide를 참조해서 SmallTalk의 특징을 살펴보면 다음과 같습니다. 

 

https://www.gnu.org/software/smalltalk/manual/html_node/

 

GNU Smalltalk User’s Guide: Top

This document describes installing and operating the GNU Smalltalk programming environment. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version publis

www.gnu.org

"smallTalk 언어에서는 모든 것이 객체입니다. 숫자나 데이터 구조뿐만 아니라 클래스, 메서드, 메서드 안의 코드블록, 스텍 프레임 등이 포함됩니다..." -GNU SmallTalk User's Guide Overview- 

 

철저한 객체 지향적 코드를 준수하기 위하여 구현할 수 있는 최대한의 요소를 객체로써 다루도록 설계한 언어입니다. 

 

Github와 GNU에 오픈소스로써 gnu SmallTalk를 이용할 수 있으나, 윈도우 환경에서 빠르게 가동할 수 있는 

 

Pharo를 통해서 순수한 Object로 구현된 smallTalk 방식의 언어를 실습해보도록 하겠습니다. 

Pharo, smallTalk에 영향을 받은 객채 지향적 언어 

https://pharo.org/web

 

Pharo - Welcome to Pharo!

The immersive programming experience Pharo is a pure object-oriented programming language and a powerful environment, focused on simplicity and immediate feedback (think IDE and OS rolled into one). It is open source and available for Mac, Windows and Linu

pharo.org

Pharo는 Pharo 언어의 장점을 다음과 같이 표현하고 있습니다. 

 

"Simple & powerful language: No constructors, no types declaration, no interfaces, no primitive types. Yet a powerful and elegant language with a full syntax fitting in one postcard! Pharo is objects and messages all the way down." 

 

기존의 복잡한 Contructor, Type선언, Interface, 기본형 등을 모두 없에고 객체와 메시지만을 남겼다고 합니다. 

 

https://www.youtube.com/watch?v=WLoXXFxU8lw 

유튜브에는 Pharo를 통해서 SmallTalk 형식의 Object를 구현해 볼 수 있는 간단한 튜토리얼이 있습니다. 

 

다음 글에서는 Pharo를 이용한 Object 구현 튜토리얼을 직접 실습해보도록 하겠습니다. 

+ Recent posts