1. 문제 상황 

  • 포스트맨으로 테스트를 했을 땐 잘 들어 가는데, 프론트에서 게시글 조회 하면 조회하는 이미지가 자꾸 엑박이 뜨고 아래와 같은 오류 메세지가 콘솔창에 떴다.  
  • Failed to load: resource: net::ERR_CERT_COMMON_NAME_INVALID
  • 확인해 보니 포스트맨에 나오는 이미지 url는 "https://namoldak.com.s3.ap-northeast-2.amazonaws.com/static/8c0ca99e-c76f-4ec5-90e1-8e6c4211" 라고 나오지만 AWS S3 버켓에서 해당 이미지 파일 주소를 확인했을 때는 "https://s3.ap-northeast-2.amazonaws.com/namoldak.com/static/8c0ca99e-c76f-4ec5-90e1-8e6c4211" 이렇게 다른 주소로 주소가 저장이 되어 있었다. 

2. 원인 

  • 버킷 이름에 .이 들어가면 Failed to load: resource: net::ERR_CERT_COMMON_NAME_INVALID 오류가 발생한다. 

 

3. 문제해결 

  • "namoldak.com" 인 버켓이름을 "namoldak"으로 바꿔 주었더니 바로 해결이 되었다 ! 

 


[ 참고 자료 ]

 

https://be-developer.tistory.com/85

 

[Spring Boot] aws s3 presignedUrl로 업로드 하는 법(One Time Token, OTT)

[Spring Boot] aws s3 presignedUrl로 업로드 하는 법 회사에서 이미지 업로드시 서버의 I/O 부하를 줄이기 위해 클라이언트에서 바로 aws의 S3에 업로드를 할 수 있도록 presignedUrl을 내리라는 미션을 받았다

be-developer.tistory.com

 

보조 스트림 

  • 다른 스트림과 연결이 되어 여러 가지 편리한 기능을 제공해주는 스트림
  • 자체적으로 입출력을 수행할 수 없기 때문에 입출력 소스와 바로 연결되는 InputStream, OutputStream, Reader, Writer 등에  연결해서 입출력을 수행한다.
  • 문자 변환, 입출력 성능 햐상, 기본 타입 입출력 등의 기능을 제공한다.

https://hudi.blog/java-filter-stream/

 

문자 변환

  • 소스 스트림이 바이트 기반 스트림(InputStream, OutputStream, FileInputStream, FileOutputStream)이면서 입출력 데이터가 문자라면 Reader와 Writer로 변환해서 사용하는 것을 고려할 수 있다.
  • 그 이유는 문자 입출력은 Reader와 Writer가 편리하기 때문
  • OutputStreamWriter는 Writer로 변환하는 보조 스트림이고, InputStreamReader는 Reader로 변환하는 보조 스트림이다.

 

성능 향상

  • 기본적으로 출력 스트림은 내부에 작은 버퍼를 가지고 있다. 하지만 이것만으로는 불충분하다.
  • 보조 스트림 중에서는 메모리 버퍼를 추가로 제공하여 프로그램의 실행 성능을 향상시키는 것들이 있다.
  • 바이트 기반 스트림에서느 BufferedInputStream, BuffuredOutputStream이 있고 문자 기반 스트림에는 BuffuerdReader, BuffuredWriter가 있다.

 

기본 타입 입출력 

  • DataInputStream과 DataOutputStream 보조  스트림을 연결하면 기본타입인 boolean, char, short, int, long, float, double을 입출력할 수 있다.

개행 출력

  • PrintStream/PrintWriter의 pringln() 메소드는 출력할 데이터 끝에 개행 문자인 '\n'을 추가한다.
  • 그래서 출력 시 콘솔이나 파일에서 줄 바꿈이 일어난다.

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

[32] JAVA 입출력 스트림  (0) 2022.12.28
[31] JAVA LIFO와 FIFO 컬렉션  (0) 2022.12.25
[30] JAVA 컬렉션 프레임워크  (0) 2022.12.25
[29] JAVA 스레드 제어  (0) 2022.12.21
[28] JAVA 멀티스레드  (0) 2022.12.21

기술 스택을 정리하다 데이터 베이스 종류와 구조에대해 정리를 하고 가면 좋겠다고 생각했다. 현재 우리는 gameStartSet 정보를 인메모리 디비인 Redis를 사용하고 있는데, 멘토님은 RDB인 MySQL사용을 추천해 주셨다. 그 차이가 뭔지 정리해 보자.


1. RDB(Relational Database)

  • RDB는 관계형 데이터 모델을 기초로 두고 모든 데이터를 2차원 테이블 형태로 표현하는 관계형 데이터베이스
  • 대표적으로 Mysql, Oracle, PostgreSql 등이 가장 많이 알려진 RDB. 아래의 그림과 같은 구조를 나타낸다.

 

 

 

- 특징

 

  • 테이블(Table) 마다 스키마(Schema)를 정의해야 된다
    •  스키마
      데이터베이스에 저장되는 데이터 구조와 제약조건을 정의한 것
      스키마 : 데이터베이스 : 테이블 = 평면도 : 집 : 방
  • 데이터 타입과 제약(Constraint)를 통해서 데이터의 정확성을 보장함
  • SQL 질의문을 통해 요청을 처리
  • 성능을 높이려며 하드웨어(H/W)를 고성능으로 교체해야 된다. (Scale Up)
  •  고성능 하드웨어는 가격이 비싸기 때문에, RDB의 성능을 높이거나 확장하기 어렵기 때문에 확장성에 좋지 않다.
  • 구성된 테이블이 다른 테이블들과 관계를 맺고 모여있는 집합체
  • 이러한 관계를 나타내기 위해 외래 키(foreign key)라는 것을 사용
  • 이러한 테이블간의 관계에서 외래 키를 이용한 테이블 간 Join이 가능하다는 게 가장 큰 특징입니다.

 

DBMS database management system

사용자와 데이터베이스 사이에서 사용자의 요구에 따라 정보를 생성해 주고 데이터베이스를 관리해 주는 소프트웨어

 

RDBMS Relational Database Management System

사용자의 요구에 따라 정보를 생성해 관계형 데이터베이스를 생성하고 수정하고 관리할 수 있는 소프트웨어

 

 

2. NoSQL(Not only SQL)

  • 대표적으로 mongoDB, hBase, redies(key-value) 등이 있으며, mongoDB의 경우 문서(document)형 데이터베이스이다.
  • hBase 같은 경우는 빅데이터 처리를 한다고 하면 누구나 한번쯤은 들어봤을 법한 DB. 아래의 그림과 같은 구조를 나타낸다.

 

 

- 특징

 

  • RDB의 확장성 이슈를 해결하기 위해 나온 데이터베이스 모델
  • 분산 컴퓨팅 활용이 목적이고, 이것을 통해 비교적 저렴한 가격으로 DB 성능을 높일 수 있다. (Scale Out)
  • 여러 개의 테이블이 아닌, 큰 테이블 하나만을 사용
  • 가장 많이 쓰이는 NoSQL의 방식은 key-value방식으로 데이터를 관리한다
  • SQL 질의문을 사용하지 않는다.
  • Schema-less (구조 변경이 용이하고, 데이터 형식이 다양하며, 바꾸기 쉬우며, 정확성 보다는 데이터 양이 중요한 빅데이터(Big Data)에 사용
  • NoSQL에서는 RDBMS와는 달리 테이블 간 관계를 정의하지 않음
  • 데이터 테이블은 그냥 하나의 테이블이며 테이블 간의 관계를 정의하지 않아 일반적으로 테이블 간 Join도 불가능

 

3. In-Memory DB

  • In-Memory DB의 경우에는 NoSQL 방식에 속하는 데이터베이스 이며, key-value방식을 사용하고 있다. 아래와 같은 구조를 갖는다.

 

 

- 특징

 

  • Memory의 가격이 용량 대비, 충분히 낮아지면서 빠른 데이터베이스 성능을 위해서 등장했다.
  • 디스트(Disk) 대신 메모리(Memory)를 사용함으로써, I/O(input/output)의 성능을 높여준다.
  • 대표적으로 Redis 및 LMDB 등이 있다

RDB(관계형 데이터베이스) RDBMS(데이터베이스를 관리)로 생성하고 수정하고 관리한다.
SQL은 RDBMS를 관리하기 위해 설계된 특수 목적의 프로그래밍 언어이고,

NOSQL(비관계형 데이터베이스)는 RDB 형태의 관계형 데이터베이스가 아닌 다른 형태의 데이터 저장방식.


[ 참고 자료 ]

 

https://im-designloper.tistory.com/67

 

[ DataBase ] RDB, RDBMS, SQL, NOSQL 간단 개념정리

데이터베이스 종류인 RDB, RDBMS, SQL, NOSQL에 대한 간단한 개념 정리!! 일단 자세한 설명전에 간단하게 용어들의 관계를 정의하자면 아래와 같습니다. 🅐RDB(관계형 데이터베이스)를 🅑RDBMS(데이터

im-designloper.tistory.com

https://toma0912.tistory.com/83

 

RDB, NoSQL, In-Memory DB 비교

안녕하세요. 오늘은 최근 많이 쓰이고 있는 데이터베이스 종류에 대해서 비교하는 포스팅을 하려고합니다. 대표적으로 분류하면 RDBMS, ORDBMS, NOSQL, NoSQL에 포함되어 있지만 In-Memory DB등이 있으며,

toma0912.tistory.com

 

'Coding > 기타' 카테고리의 다른 글

WebServer vs Was  (0) 2023.01.13
ChatGPT !! 엄청나다 !!  (0) 2023.01.10
HTTP 이해  (0) 2022.12.06
기술매니저님 추천 사이트 ( Spring 관련 )  (0) 2022.12.02
RESTful API 설계 가이드  (0) 2022.12.01

프로젝트를 진행하면서 에러가 발생할 경우 데이터가 잘 들어가는지 확인하기위해 로깅을 할 때가 자주 있다. 오늘은 스프링부트 lombok에서 제공하는 (@Slf4j)를 이용한 로깅법을 정리해보려 한다.

 

실제로 이번 프로젝트에 사용한 예제

 

Logging 이란? 

  • 로깅(logging)은 정보를 제공하는 일련의 기록인 로그(log)를 생성하도록 시스템을 작성하는 활동을 말한다.
  • 프린트 줄 넣기(printlning)는 간단한, 보통은 일시적인, 로그를 생성하기만 한다. 
  • 시스템 설계자들은 시스템의 복잡성 때문에 로그를 이해하고 사용해야 한다.
  • 로그가 제공하는 정보의 양은, 이상적으로는 프로그램이 실행되는 중에도, 설정 가능해야한다.

 

Logging 사용시 장점

  • 쓰레드 정보, 클래스 이름 같은 부가 정보를 함께 볼 수 있고, 출력 모양을 조정할 수 있다.
  • 로그 레벨에 따라 개발 서버에서는 모든 로그를 출력하고, 운영서버에서는 출력하지 않는 등 로그를 상황에 맞게 조절할 수 있다.
  • 시스템 아웃 콘솔에만 출력하는 것이 아니라, 파일이나 네트워크 등, 로그를 별도의 위치에 남길 수 있다. 특히 파일로 남길 때는 일별, 특정 용량에 따라 로그를 분할하는 것도 가능하다.
  • 성능도 일반 System.out보다 좋다. (내부 버퍼링, 멀티 쓰레드 등등) 그래서 실무에서는 꼭 로그를 사용해야 한다.

 

로그 선언 및 호출

 

//선언
private Logger log = LoggerFactory.getLogger(getClass());
private static final Logger log = LoggerFactory.getLogger(Xxx.class)

//lombok
@Slf4j

//호출
log.info("hello");

 

간단한 동작 예제

package hello.springmvc.basic;

import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

//http body 에 string 을 넣어줌
// 기존 Controller 와 차이 있음
@RestController
@Slf4j //private... Logger 선언 귀찮을 때 대체할 수 있음
public class LogTestController {

//    private final Logger log = LoggerFactory.getLogger(getClass());

    @RequestMapping("/log-test")
    public String logTest(){
        String name = "Spring";

        //앞으로 이런방식 권장하지 않음
        System.out.println("name = " + name);

        log.trace(" trace my log="+ name);

        log.trace("trace log={}", name);

        log.debug("debug log={}", name);
        log.info(" info log={}", name);
        log.warn(" warn log={}", name);
        log.error("error log={}", name);
        return "ok";
    }
}
  • LEVEL : TRACE > DEBUG > INFO > WARN > ERROR
  • 개발 서버는 debug 출력
  • 운영 서버는 info 출력

올바른 사용법

  • log.debug("data="+data");
    • 로깅레벨이 debug 보다 높을 때에도 문자 더하기 연산이 수행됨(출력이 안되어도)
  • log.debug("data = {},data);
    • 의미없는 연산 발생하지 않음

 

 


[ 참고 자료 ]

 

https://goldsony.tistory.com/37

Web Server

  • 웹 브라우저 클라이언트로부터 HTTP 요청을 받아들이고 HTML 문서와 같은 웹페이지를 반환하는 컴퓨터 프로그램
  • 클라이언트가 웹 브라우저에 어떠한 페이지 요청을 하면 웹 서버에서 그 요청을 받아 정적 컨텐츠를 제공하는 서버
  • 정적 컨텐츠란 HTML, CSS, JavaScript, 이미지, 파일 등 즉시 응답 가능한 컨텐츠를 의미한다.
  • 웹 서버가 동적 컨텐츠 요청을 받는 경우, WAS에게 해당 요청을 넘겨주고 WAS에서 처리한 결과를 다시 클라이언트에게 전달해주는 역할을 한다.
  • 대표적인 웹 서버엔 Apache 가 있다.

 

WAS

  • 인터넷 상에서 HTTP 프로토콜을 통해 사용자 컴퓨터나 장치에 애플리케이션을 수행하주는 미들웨어이다
  • 주로 동적 서버 컨텐츠를 수행하는 것으로 웹 서버와 구별이 되며, 주로 데이터 베이서 서버와 같이 수행한다.
  • WAS는 웹 서버와 웹 컨테이너가 합쳐진 형태로, 웹 서버 단독으로는 처리할 수 없는 데이터베이스의 조회나 다양한 로직 처리가 필요한 동적 컨텐츠(JSP, ASP, PHP)를 제공한다.
  •  덕분에 사용자의 다양한 요구에 맞춰 웹 서비스를 제공할 수 있다.
  • WAS는 JSP, Sevlet 구동환경을 제공해주기 때문에 웹 컨테이너 혹은 서블릿 컨테이너라고도 불린다.
  • 대표적인 WAS 종류엔 Tomcat이 있다.

 

Wev Service Architecture

웹 어플리케이션은 요청 처리 방식에 따라 다양한 구조를 가질 수 있다.

  1. 클라이언트(사용자) -> WebServer -> DB
  2. 클라이언트 -> WAS -> DB
  3. 클라이언트 -> WebServer -> WAS -> DB

https://codechasseur.tistory.com/25

 

WebServer 와 WAS를 나누는 이유

이론대로라면 WAS의 경우 웹서버 + 웹컨테이너의 개념이기 때문에 웹서버가 없더라도 웹서버의 역할을 동시에 수행할 수 있다.

그런데 왜 나눠서 사용할까?

 

1 데이터 처리 방식

  • 위의 설명대로 웹서버는 정적 컨텐츠를, WAS는 동적 컨텐츠를 처리한다.
  • 만약 부하가 적은 웹서비스라면 두가지 요청을 WAS 하나로 다 처리해도 되지만, 부하가 많다면 빠른 시간에 처리할 수 있는 정적컨텐츠를 WAS에서 처리하는 것은 비효율적이다.
  • 웹서버를 WAS 앞에 두고 필요한 WAS들을 WebServer에 플러그인 형태로 설정하면 더 효율적인 분산처리가 가능하다.

2. 보안상의 이유

  • 사용자들에게 WAS는 공개될 필요가 없다.
  • WAS의 경우 DB서버에 대한 접속 정보가 있기때문에 외부로 노출될 경우 보안상 문제가 될 수 있다.
  • 이러한 이유로 웹 서버의 경우 DMZ구간에 위치하고 WAS는 내부망에 위치시켜 보안을 유지할 수 있다.

 

Tomcat vs Apache Tomcat

  • 위에서 언급한 대로 웹 서버의 대표는 Apache, WAS의 대표는 Tomcat이 있다.
  • Tomcat은 Apache Tomcat 이라는 이름으로 많이 사용되는데, 이유는 Tomcat5.5 버전부터 정적 컨텐츠를 처리하는 기능이 추가되어 이 기능이 순수 Apache를 사용하는 것에 비해 성능적 차이가 거의 없으며 Tomcat이 Apache의 기능을 포함하고 있기 때문이다.

 


[ 참고 자료 ]

 

'Coding > 기타' 카테고리의 다른 글

[ DataBase ] RDB, NOSQL, In-Memory  (0) 2023.01.22
ChatGPT !! 엄청나다 !!  (0) 2023.01.10
HTTP 이해  (0) 2022.12.06
기술매니저님 추천 사이트 ( Spring 관련 )  (0) 2022.12.02
RESTful API 설계 가이드  (0) 2022.12.01

+ Recent posts