더보기

virtual machine이란?

 

가상 머신은 컴퓨팅 환경을 소프트웨어로 구현한 것, 즉 컴퓨터 시스템을 에뮬레이션하는 소프트웨어다.

가상머신상에서 운영 체제나 응용 프로그램을 설치 및 실행할 수 있다. 

vitural machine의 종류에는 VM Workstation, VMware Server, Virtual Box, Paralles Workstation 등이 있다.

 

 📌 가상머신의 특성

가상 머신을 사용하면 여러 운영체제나 시스템을 완벽히 독립된 채로 같은 컴퓨터에서 이용할 수 있다.

따라서 사용자가 하드웨어를 직접 혼자 쓰는 것처럼 느끼게 만든다. 이는 하드웨어나 VM 사이에서 중재해주는 하이퍼바이저 덕분이다.

 

 📌 단점

만약 하나의 물리적 시스템에서 여러 VM을 돌릴 경우 성능이 불안정해질 수 있으며 가상머신은 물리적 컴퓨터보다 파일 입출력 작업의 성능이 낮음 등 효율성이 떨어지며 실행 속도가 느리다는 단점이 있다.

 📌 Public cloud

퍼블릭 클라우드는 CSP가 인터넷 망을 통해 사용자에게 컴퓨팅 자원을 빌려주는 것이다.

이는 사용료를 지불하면서 빌려쓰는 방식으로 IT 자원에 대한 구매가 아닌 '구독'을 하고 사용한 만큼 사용료를 지불한다.

따라서 초기 토자 비용이 절감되기도 한다. 또한 클라우드는 정기적인 최신 성능 업그레이드가 이루어지기 때문에 시설 노후화에 대한 부담 감소가 있다. 그리고 OPEX 기반 환경이므로 CAPEX가 적고 특정 기업에 갇힐 확률이 적다.

하지만 클라우드에서 정보 유출 사고가 발생할 경우 detect가 힘들고 인터넷이 어떻게 끊길지 모른다는 단점이 있다.

이는 대체로 규모가 중-소인 기업에 적절하다.

 

 📌 Private cloud

프라이빗 클라우드는 자신의 온프레미스(on-premise)내에 클라우드 플랫폼을 구축해서 운영한다.

자체적으로 보안 시스템을 운영할 수 있고, 사용자의 필요와 요구에 따라 맞춤형 구축이 가능하다는 장점이 있다.

하지만 설치운영 비용인 CAPEX가 생기고 관리를 위한 전문가 고용이 필요하다는 단점이 있다. 또한 특정 기업에 갇힐 확률이 크다.

이는 규모가 큰 비지니스에 적절하다.

 

 📌 Hybrid cloud

하이브리드 클라우드는 public과 private cloud를 혼합한 형태이다. 보안이 중요한 것은 private cloud로, 신규 서비스나 이벤트 등 예측하기 어려운 대용량 데이터는 신속하게 자원을 확장할 수 있도록 public cloud에 배치하는 것이다. 이는 퍼블릭 클라우드의 유연성과 확장성, 비용 효율성을 누리면서 보안 걱정을 덜 수 있다.

출처: 클라우드컴퓨팅서비스 보안관리 5주차 pdf

 

📌 IaaS (Infrastructure as a Service)

IaaS는 이용자가 서버나 스토리지 같은 하드웨어 자원을 빌려쓰기 때문에 데이터, 처리 기능, 도구 및 운영 관리에 대해 높은 수준의 제어를 가지고 있다.

따라서 이용자는 환경구성부터 응용 서비스 등에 대한 전반적인 책임이 있으며 CSP는 하드웨어 가용성이나 유지보수 정도의 책임만 가진다.

즉, OS, data, application, middleware, runtime을 담당하고 CSP는 network, server, virtualization, storage 관리와 액세스를 담당한다.

 

 📌 PaaS (Platform as a Service)

PaaS는 CSP가 애플리케이션이나 서버가 실행되는 환경을 제공한다. 즉, 소프트웨어 서비스를 개발할 때 필요한 플랫폼을 제공한다.

따라서 이용자는 데이터 처리 및 관련 풀, 응용 프로그램에 대한 책임이 있으며 CSP는 OS 환경 구성이나 시스템 패치 등에 대한 책임이 있다.

 

 📌 SaaS (Software as a Service)

SaaS는 CSP가 애플리케이션이나 소프트웨어를 서비스 형태로 제공하는 것으로 이용자는 데이터 관리에 대한 책임만 가지고 CSP는 데이터, 미들웨어부터 서버, 스토리지 같은 모든 기술 문제에 대한 책임이 있다.

 📌 Time Sharing

프로세서가 한 번에 하나의 프로세스를 처리할 수 있기 때문에 하나의 프로세스가 무거운 작업을 수행한다면 다른 프로세스들은 처리 기회를 얻지 못한다.

따라서 OS는 CPU 스케줄링을 통해 SJF, FIFO와 같은 방법으로 여러 프로세스가 효율적이고 공평하게 처리되도록 한다.

클라우드 서비스는 Time Sharing을 통해 여러 사용자가 공평하고 빠르게 처리된다고 느낄 것이다.

 

 📌 Resource Pooling

Resource Pooling은 자원을 미리 확보한 후 클라우드 환경에서 사용자가 원할 때마다 자원을 할당해주고 다시 회수한다.

예를 들어, 도서관(Pool)에서 책(Resource)을 사람들이 원할 때마다 빌리고(할당) 반납(회수)하는 것과 같다.

공유되는 자원은 유연하고 효율적으로 관리되며, 이는 가상화를 통해 구현할 수 있다.

 📌 과대자원, 과소자원이 나오게 된 배경

그래프와 같이 사용자의 요구 자원은 시간이 흐름에 따라 대체로 일정하게 증가한다.

하지만 컴퓨터의 성능은 선형적으로 증가하지 않는다. 여기서 과대자원, 과소자원의 개념이 나온다.

 

 📌 과대자원

사용자의 요구 자원보다 성능이 좋은 경우 과대자원이라고 한다. 즉, 자원이 넉넉한 경우이다.

클라우드 관점에서 사용자가 원하는 자원의 수준보다 성능이 높기 때문에 서비스 제공에는 문제가 없지만 자원이 남게 되어 가동률이 낮아짐에 따라 예산의 낭비가 있을 수 있다.

 

 📌 과소자원

반대로 요구자원보다 성능이 안좋은 경우 과소자원이라고 한다. 즉, 자원이 부족한 경우이다.

클라우드 관점에서 비용이 절약되어 좋지만 그만큼 서비스 제공에 제약이 있을 수 있다.

 

 📌 결론

비용 절약과 서비스 제공 사이에서 타협점을 찾는 것이 중요한데, 이성적으로는 사용자의 요구 자원 수준보다 살짝 높은 성능을 제공하는 것이다.

 📌 문제

에셋을 가져와서 적용하고 빌드를 했을 경우 원래 이미지와 색상이 다르게 나오는 경우가 있다.

 

asset

왼쪽 이미지와 같이 원래 검정색 아이콘을 가지고 탭바를 구성해주었는데,

실제 빌드 해보면 오른쪽과 같이 선택된 탭인 경우는 default tint색인 blue가 적용되어서 나온다.

(왼쪽 이미지 아이콘이 회색인 이유는 선택되지 않은 탭이기 때문이다.)

 

 📌 해결 방법

Assets.xcassets에서 해당 에셋을 선택하고 오른쪽의 인스펙터 창에서 Render As를 Original Image로 설정해준다.

오른쪽 집 아이콘은 Render As를 Original Image로 변경한 것이고, 왼쪽의 이미지 아이콘은 Render As가 Default로 설정되어 있다.

 

 

+ 참고

만약 Asset의 Render As를 Original Image로 설정할 경우 tabBar Item에 tintColor를 변경해주어도 아무런 반응이 없다!

 📌 필요한 기능

인스타그램 클론코딩을 하면서 탭바를 구현하였는데 메인탭에 진입시에는 흰색 탭바 배경과 검정색의 아이콘들이 필요했고,

릴스탭을 누를 때는 탭바 배경색은 black으로, item들 색은 white로 변경해야 했다.

구현 후 화면은 다음과 같다.

인스타그램 메인

 📌 초기 설정

* 스토리보드로 구현하였기 때문에 인스펙터 창에서 설정해주었습니다.

먼저 초기 설정을 위해 TabBarController가 있는 스토리보드에서 탭바를 선택하고 오른쪽 인스펙터 창에서 Background로 White Color로 설정하였다.

그리고 User Defined Runtime Attributes에서 unselectedItemTintColor와 tintColot를 Black으로 설정하였다.

* tintColor는 선택된 탭바아이템, unselectedItemTintColor는 나머지 탭바아이템 색상이다.

 

이렇게 하면 메인화면으로 진입 시 아래와 같이 나온다.

 

 📌 Delegate

릴스탭을 선택할 경우 색상들을 바꿔주기 위해 Delegate를 사용했다.

코드를 먼저 보고 설명하도록 하겠다.

import UIKit

class TabBarController: UITabBarController {
    
    // MARK: - Life Cycle
    override func viewDidLoad() {
        super.viewDidLoad()
        
        setDelegate()
    }
}

// MARK: - Custom Methods
extension TabBarController {
    private func setDelegate() {
        self.delegate = self
    }
}

// MARK: - UITabBarControllerDelegate
extension TabBarController: UITabBarControllerDelegate {
    func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
        if selectedIndex == 2 {
            tabBar.backgroundColor = .black
            tabBar.tintColor = .white
            tabBar.unselectedItemTintColor = .white
        } else {
            tabBar.backgroundColor = .white
            tabBar.tintColor = .black
            tabBar.unselectedItemTintColor = .black
        }
    }
}

먼저 UITabBarControllerDelegate 프로토콜 채택 작업을 진행한다. 아래 부분에 해당한다.

extension TabBarController: UITabBarControllerDelegate {}

* 저는 가독성을 위해 extension으로 빼준 것이므로 아래와 같이 작성해주는 것도 가능합니다.

class TabBarController: UITabBarController, UITabBarControllerDelegate {}

이후 Delegate 대리자를 설정해주어야 한다.

self.delegate = self

이 코드를 viewDidLoad()에 작성해준다.

* 저는 함수로 빼주었습니다.

 

해당 코드는 탭바 아이템을 선택했을 때 TabBarController가 delegate를 사용하기 위한 것이다.

 

 📌 색상 변경

func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
    if selectedIndex == 2 {
        tabBar.backgroundColor = .black
        tabBar.tintColor = .white
        tabBar.unselectedItemTintColor = .white
    } else {
        tabBar.backgroundColor = .white
        tabBar.tintColor = .black
        tabBar.unselectedItemTintColor = .black
    }
}

tabBarController 함수는 tabBar delegate method로 탭이 선택되었을 때 작동한다.

 

selectedIndex는 몇 번째 뷰컨을 선택했는지에 대한 인덱스 값이다.

인덱스 값은 0부터 시작하므로 릴스탭은 인덱스 값이 2이다.

 

따라서 selectedIndex 값이 2일 경우 배경을 검정으로, 아이템을 흰색으로 바꿔주는 작업을 하면 된다.

추가로 selectedIndex 값이 2가 아닐 경우는 다시 배경을 흰색으로, 아이템을 검정색으로 바꿔주는 작업이 필요하다.

 

총 세 개의 속성을 주면 된다!

tabBar.backgroundColor = .black // 탭바의 배경 색상을 바꿔준다.
tabBar.tintColor = .white // 선택된 탭바 아이템의 색상을 바꿔준다.
tabBar.unselectedItemTintColor = .white // 선택되지 않은 탭바 아이템의 색상을 바꿔준다.

💡 OSI 7계층이란?

OSI 7계층은 네트워크에서 통신이 일어나는 과정을 7단계로 나눈 것

 

✨ OSI 7계층 모델

 

✨ TCP/IP 4계층 모델과의 차이

OSI 7계층 TCP/IP 4계층
응용, 표현, 세션 응용
전송 전송
네트워크 인터넷
데이터 링크, 물리 네트워크

 

1. 물리 계층

  • 리피터, 케이블, 허브 등
  • 전송 단위: Bit
  • 데이터를 전송하는 역할을 한다.

2. 데이터 링크 계층

  • 브릿지, 스위치, 랜카드 등
  • 전송 단위: Frame
  • Mac 주소를 통해 통신한다.
  • 네트워크 계층에서 받은 정보에 주소와 제어 정보를 헤더와 테일에 추가한다.
  • 에러 검출, 재전송, 흐름제어를 한다.

3. 네트워크 계층

  • 라우터, L3 스위치
  • 전송 단위: Packet,
  • IP 주소를 통해 통신한다.
  • 상위 계층의 데이터를 작은 크기의 패킷으로 분할하여 해당 경로에 따라 전달한다.
  • 데이터를 목적지까지 가장 안전하고 빠르게 전달하는 기능을 담당한다.
  • 라우팅, 흐름 제어, 오류 제어, 세그멘테이션 등을 수행한다.

4. 전송 계층

  • 대표적인 프로토콜로 TCP (신뢰성, 연결 지향적), UDP(비신뢰성, 비연결성, 실시간)가 있다.
  • 전송 단위: Segment
  • Port 번호를 통해 통신한다.
  • 상위 프로토콜을 구분하고 패킷의 순서와 손상을 보장한다.
  • 송신 컴퓨터의 응용 프로그램서 수신 컴퓨터의 응용 프로그램까지의 메시지 오류 복구와 흐름 제어를 관리한다.

5. 세션 계층

  • API, Socket
  • 전송 단위: Message
  • 데이터가 통신하기 위한 논리적 연결을 담당한다.
  • TCP/IP 세션을 만들고 없애는 책임을 가지고 있다.

6. 표현 계층

  • JPEG, MPEG 등
  • 전송 단위: Message
  • 데이터 표현에 대한 독립성을 제공하고 암호화하는 역할을 담당한다.
  • 파일 인코딩, 명령어를 포장, 압축, 암호화한다.

7. 응용 계층

  • HTTP, FTP, DNS
  • 전송 단위: Message
  • 사용자와 가장 밀접한 계층으로 인터페이스 역할을 한다.
  • 전자 우편, 데이터베이스 관리 등의 서비스를 제공한다.

참고
https://gyoogle.dev/blog/computer-science/network/OSI 7계층.html
https://blog.naver.com/PostView.nhn?blogId=tmk0429&logNo=222294381124
https://hahahoho5915.tistory.com/15

 📌 들어가며

비밀번호 입력창에 눈 아이콘 버튼을 두고 이 버튼을 선택함에 따라 비밀번호 보기/숨기기를 구현하려고 한다.

눈 아이콘 선택 시 비밀번호 보기/숨기기

 

해당 뷰는 스토리보드로 구현하였으며 해당 TextField와 Button 네이밍은 다음과 같다.

	@IBOutlet weak var passwordTextField: UITextField!
	@IBOutlet weak var passwordEyeButton: UIButton!

 

passwordTextField는 .isSecureTextEntry속성 default 값을 true로 주었다.

 

 📌 필요한 로직

이 기능을 구현하기 위해서는 세 가지 설정이 필요하다.

  • 버튼 선택 상태 변경
  • 비밀번호 보기/숨기기
  • 눈 아이콘(버튼 이미지) 변경

 

 📌 코드

    @IBAction func passwordEyeButtonDidTap(_ sender: Any) {
        // 보안 설정 반전
        passwordTextField.isSecureTextEntry.toggle()
        // 버튼 선택 상태 반전
        passwordEyeButton.isSelected.toggle()
        // 버튼 선택 상태에 따른 눈 모양 이미지 변경
        let eyeImage = passwordEyeButton.isSelected ? "password shown eye icon" : "password hidden eye icon"
        passwordEyeButton.setImage(UIImage(named: eyeImage), for: .normal)
        // 버튼 선택된 경우 자동으로 들어가는 틴트 컬러를 투명으로 변경해줌
        passwordEyeButton.tintColor = .clear
    }

 

 📌 마치며

처음에 eyeButton.isSelected 값을 바꿔주는 코드를 작성하지 않아서 비밀번호 보안 설정은 바뀌지만 눈 모양 아이콘 변경이 되지 않았다.

passwordTextField 보안 설정을 toggle()로 변경해준 코드를 보고 passwordEyebButton도 바꿔줬다고 착각해서 삽질을 했다는 거~  🫠

눈을 제대로 뜨자 👀

 

 📌 들어가며

서버 시간이 미국 기준이기 때문에 한국 시간으로 변경하는 것이 필요했다.

이번 포스팅에서는 aws RDS timezone 변경 방법에 대해 다뤄보려고 한다.

 

변경 방법은 크게

파라미터 그룹 생성 -> 파라미터 그룹 설정 변경(timezone 변경) -> 해당 디비에 생성한 파라미터 그룹 설정

으로 진행된다.

 

 📌 파라미터 그룹 생성

먼저 aws에 접속한다.

https://aws.amazon.com/ko/console/

 

AWS Management Console

AWS Support 플랜은 AWS로 성공하는 데 도움이 되는 다양한 도구, 프로그램 및 전문 지식에 대한 액세스의 조합을 제공합니다.

aws.amazon.com

 

이후 RDS 서비스를 검색하고 들어가서 왼쪽의 메뉴들 중 [파라미터 그룹]에 들어간다.

이미 데이터베이스를 하나 생성했기 때문에 default로 본인의 데이터베이스에 맞는 파라미터 그룹이 생성되어 있을 것이다.

dafault는 변경이 불가능 하기 때문에 파라미터 그룹을 새로 생성해주어야 한다.

 

오른쪽 주황색 버튼 [파라미터 그룹 생성]을 클릭한다.

 

파라미터 그룹 패밀리에는 본인이 사용한 데이터 베이스를 넣는다.

나는 postgreSQL을 사용했기 때문에 postgres12로 넣어줬다.

어떤 값을 넣어야 하는지 헷갈린다면 앞에서 보았던 default 파라미터 그룹의 패밀리와 동일하게 선택하면 된다.

 

파라미터 유형은 DB Parameter Group 그대로 선택한다.

그룹 이름과 설명은 본인이 원하는 대로 입력하면 된다.

나는 timezone 변경을 위한 파라미터 그룹이었으므로 그룹 이름에 timezone이라고 입력해두었다.

 

이후 생성 버튼을 누른다.

 

timezone이라는 파라미터 그룹 생성 완료 👏

 

 📌 파라미터 설정 변경 (timezone 변경)

생성한 파라미터 그룹을 클릭해서 들어간다.

나는 timezone을 클릭했다.

이런 화면이 뜨게 되는데,

여기서 [파라미터 편집]을 눌러준다.

 

이렇게 화면이 바뀌었다면

파라미터 필터링에 timezone을 입력한다.

 

postgreSQL을 사용했기 때문에 여기서 timezone을 UTC에서 UTC+9로 변경 후 [변경 사항 저장]을 누른다.

 

데이터베이스마다 어떤 형식을 사용해야 하는지는 aws 공식 문서에 있습니다.

https://aws.amazon.com/ko/premiumsupport/knowledge-center/rds-change-time-zone/

 

Amazon RDS DB 인스턴스의 시간대 변경

Amazon Relational Database Service(Amazon RDS) DB 인스턴스의 시간대를 현지 시간대로 변경하려고 합니다. DB 인스턴스의 시간대를 변경하려면 어떻게 해야 합니까?

aws.amazon.com

 

 📌 디비에 새로운 파라미터 그룹 설정

데이터베이스 인스턴스에 새로 생성한 파라미터 그룹으로 변경하기 위해 왼쪽 메뉴의 [데이터베이스]로 들어간다.

타임존을 변경할 데이터 베이스를 선택한다.

 

오른쪽 상단의 [수정]을 클릭한다.

 

아래로 스크롤 후 [추가 구성] - [데이터베이스 옵션] - [DB 파라미터 그룹]을 default에서 timezone으로 변경해준다.

 

[수정 예약] 옵션을 [즉시 적용]으로 선택한 후 [DB 인스턴스 수정]을 누른다.

 

성공!

 

혹시 Datagrip에서 한국 시간으로 제대로 안나온다 하시는 분은 Datagrip을 껐다 켜보시면.. 될 겁니다...!

제가 그랬습니다 하하

+ Recent posts