컴포즈 오랜만에 사용하려니 기억이 가물가물해서

확인차 공식문서의 튜토리얼을 시도해보려고 한다.

 

강의 1: 구성 가능한 함수

공식 문서에 따르면 Compose는 함수 중심 빌드 방식을 채용했다고 한다.

해당 방식을 사용하면 높은 가독성으로 UI를 정의할 수 있다고 한다.

 

이때 중요한 방식이 @Composable 어노테이션을 사용하여

해당 함수가 Compose UI를 사용한다는 표시이다.

 

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.material3.Text //compose Text

class MainActivity : ComponentActivity() {
	override fun onCreate(savedInstanceState: Bundle?) {
    	super.onCreate(saveInstanceState)
        setContent {
        	Text("Hello world")
        }
    }
}

위 소스코드는  간단한 텍스트 요소를 추가하는 코드인데

컴포즈 방식이 최신 기술이다보니 Kotlin 언어를 채용해서 사용한 듯 하다.

 

코드상으로 볼 때

setContent 는 옛 방식인 xml 방식에서 setContentView 대체인 것 같다.

이후 바인딩 된 화면(xml로 보면 Layout 가장 루트영역)에 TextView를 추가한 느낌이다.

코드로 본다면 아래와 같다 생각된다.

//import ...

class MainActivity : AppCompatActivity() {
	override fun onCreate(savedInstanceState: Bundle?) {
    	super.onCreate(saveInstanceState)
        setContentView(R.layout.activity_main)
        
        textView = findView.ById(R.id.textView)
        textView.text = "Hello world"
    }
}
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
	xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    
    <TextView
    	android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello world" />
</androidx.constraintlayout.widget.ConstraintLayout>

기존 XML 방식에서는 바인딩이 필수적으로 필요했기에 Kotlin으로 작성된 바인딩 코드로 위에 작성하였고

그에 따른 바인딩 될 필수 xml도 필요했기에 아래처럼 표현했다.

 

기존 방식인 XML은 바인딩코드(Kotlin or Java)와 바인딩 할 화면 코드(XML) 이렇게 두개가 필요했으나

Compose 방식은 코드가 간결해지고 하나를 위해 두가지를 작업하던 방식을 개선하였다.

 

그리고 이전 방식에 포함되지 않던 미리보기 기능을 하는 @Preview 어노테이션이 추가되었다.

해당 어노테이션을 통해 에뮬레이터 설치 없이 미리보기가 가능하다고 한다.

...

@Composable
fun MessageCard(name: String) {
	Text(text = "Hello $name!")
}

@Preview
@Composable
fun PreviewMessageCard() {
    MessageCard("Android")
}

(좌) XML 미리보기 방식, (우) @Preview 어노테이션 방식

좌측에 사용되던 XML 방식은 미리보기가 가능하나 마크업 언어이기에 재사용성 함수를 사용할 수 없기에 동적 변화에 대한 대응이 불가능하다는 단점이 있었으나 우측의 방식은 @Preview 어노테이션을 사용하는 Compose 방식으로 미리보기를 봄과 동시에 재사용성 함수에 대한 동적 변화도 확인할 수 있는 장점이 있다!

(라고는 하나 사실 방식의 차이일뿐 기능은 같다봐야될 것 같다.)
+) 함수형이라 테스트해봤는데 변수를 넣고 디자인에서 변경됨을 확인해봤으나 변경되지 않음을 확인했다... 안되는건가..?

 

강의 2: 레이아웃

XML 방식에서도 레이아웃 방식이 존재했었다.

대표적으로 ConstraintLayout, RelativeLayout, LinearLayout 정도가 있다.

그 외에도 테이블이니 그리드니 여러가지가 존재했지만 사실상 자주 사용되던 방식은 저 세가지가 가장 많았던 것 같다.

 

@LinearLayout
- 가장 많이 사용했던 레이아웃이다. 순서대로 쌓는 느낌이라보면 되는데 쌓는다는게 '스택'처럼 위로 쌓이는 것이 아닌 한쪽 방향으로 쌓인다 보면 될 것 같다. 예를 들어 TextView를 왼쪽에서 오른쪽 방향으로 코드를 작성한다면

TextView, TextView, TextView

로 될 것이다.

@RelativeLayout

- 부모 혹은 특정 뷰를 기준으로 정렬하는 방식입니다. 예를 들어 좌측에 TextView(a) 가 존재하고 해당 a라는 뷰 옆에 b 라는 TextView를 놓는 코드를 작성하게 된다면

TextView(b), TextView(a)

로 될 것이다.

@ConstraintLayout

- 자주...사용하던 방식은 아니나 참 괜찮은 방식인 걸로 알고 있다. RelativeLayout에서 아쉬운 점을 보완하여 체인 스타일이라는 시스템이 존재하고 예를 들어 TextView 두 개를 중앙 정렬 공평하게 두 개로 둔다는 코드를 작성하면

ㅁㅁㅁㅁTextViewㅁㅁTextViewㅁㅁㅁㅁ

와 같은 화면이 된다. (이때 ㅁ은 띄어쓰기로 생각)

(라고 찾아보니 그렇게 명시되어 있으나 사실 자주 쓰지 않아서 명확히는 모르겠다.)

 

근.데

이번에 새로 나온 Compose 방식은 Flutter 방식과 유사한 Column과 Row 방식을 채택하였습니다.

그래서 기존에 Layout 방식이 아닌 가로 배열 및 세로 배열만 주로 사용될 예정입니다.

(추가로 기본 레이아웃은 Flutter에 Stack 구조인 듯 합니다. 그래서 Text 함수를 두 번 작성할 시 서로 겹치게 됩니다.)

Column {
	Text(text = "저자")
	Text(text = "내용")
}

위 처럼 세로 배열 방식 Column을 사용 시

저자
내용

위 처럼 결과가 나오게 됩니다.

 

Row {
	Text(text = "저자")
	Text(text = "내용")
}

반대로 위처럼 Row를 사용할 경우

저자내용

위처럼 가로 배열 방식이 나오게 된다.

 

배열을 통해 레이아웃에 혁신적인(?) 느낌으로 만들 수 있게 되었다.

기존에 layout 시스템들은 너무 View마다 의존하는 느낌도 강했고 하나를 고치면 다른 것들도 다 고쳐야 됐었으나..(특히나 ConstraintLayout이 대표적으로 그랬다......) Compose Layout의 배열방식이 새롭게 생겨나면서 기존 레이아웃과는 의존도도 낮아지고 굉장히 좋아졌었다.

 

이번에는 배열이 아닌 이미지를 한번 확인해보자.

Image(
            painter = painterResource(R.drawable.profile_picture),
            contentDescription = "Contact profile picture",
        )

Image 위젯을 만드는 예시이다.

paint와 contentDescription은 Image 위젯의 파라미터로 사용되는 변수들이다.

각각 painter는 painterResource를 통해 asset에 들어있는 xml 이미지를 불러올 수 있고 contentDescription은 이미지 설명으로 사용되는 느낌이다.

 

다음은 위젯에 대한 padding과 margin 처리다.

이전에 XML 방식에서는

layout, view 등등에 margin을 각각 넣거나 인자를 추가해서 사용하는 방식이었다.

XML 방식 padding

(진짜 세상....복잡하다..)

 

Compose에서는 해당 방식을 Modifier(수정자)를 통해 변경이 가능하다.

Column {
            Text("all_padding", 
            	modifier = Modifier.padding(all = 20.dp).background(Color(0xFF00FFFF)))
            Text("normal", 
            	modifier = Modifier.background(Color(0xFFCAA926)))
            Text("padding", 
            	modifier = Modifier.padding(top = 50.dp, start = 50.dp, end = 50.dp, bottom = 50.dp).background(Color(0xFF00F05F)))
        }

저렇게 긴 xml이 불필요한 것을 제외시키면 위와 같은 간단한(?) 코드가 완성된다.

(사실 인자로만 보면 간단하긴해도 짧아진 건 못느끼겠다.)

꽤나 간단 명료하게 해결가능하다.

 

여기까지가 강의 4개 중 2개의 내용인데

확실히 어떤 느낌의 방식인지 UI적으로는 납득했다.

다만 소스코드 상에서 동적 변경이나 여러 동작들을 곁들이는 것이 가능할 지 여부까지는 잘 모르겠다.

 

원래는 cloudtype 사이트에 대해 다뤄보려했으나 모종의 이유로 먼저 다루게 되었으며

이후에는 남은 강의 2개에 대해 작성하거나 혹은 이번에 다우기술 채용과 관련하여 사전과제를 하면서 정말정말 정말 많이 부족하단 사실을 알게되어서.. 해당 과제에서 다뤘던 기술들에 대해 공부하고 포스팅을 써볼 예정이다.

많은 분들이 댓 남겨주시고 실제로 남겨주시는 분들도 계십니다만

기록용 블로그이다보니 답변이나 친구는 되도록 마음만 받겠습니다 관심 감사합니다.

그래도 글과 관련된 질문들은 답변드리도록 하겠습니다.

 

하 진짜 애 많이썼다..

이거 하느라 굉장히 힘들었었다.

검색 시 기본적으로 관련 지식도 많이 없고

있다고 하더라도 대부분 비공식 옛 패키지 사용이었다.

 

CloudFlare R2는 정식으로 S3 api를 사용할 수 있도록 권장한다고 써져있고

일부분 기능은 사용할 수 없으나 기본적으로 버킷과 관련된 것들과 버킷 내 데이터 업로드 및 읽기는 가능한 걸로 봤다.

근데도 불구하고 관련된 지식이 없는 것은 아무래도 R2 스토리지에 대해 유명세가 파이어베이스 스토리지에 비해 적다는 이유가 가장 크지 않을까 싶다.

 

하..길고 길었다 삽질..

삽질 기록 시작!

 

* 삽질 기록

- 기록 보기 귀찮고 사용법만 보실 분들은 아래 CloudFlare R2 플러터 내 사용법을 확인해주세요.

더보기

https://stackoverflow.com/questions/78099780/cloudflare-r2-with-flutter

 

CloudFlare R2 with Flutter

I want to use CloudFlre R2 as storage for my Flutter app. I have AccessKey, SecertKey and r2Token. Unfortunately, I cannot find a package or HTTP request to upload a file to an R2 bucket. I tried u...

stackoverflow.com

첫번째로 봤던 오버플로우 글이었다.

CloudFlare R2를 http 통신으로 사용하고 싶은데 어떻게 써야될 지 묻는 질문이었고

해당 질문에 대해서 http가 아닌 s3 api 패키지를 추천해주며 해당 패키지 내 endpoint를 s3 방식의 url에서 R2 방식의 url로 변경하고 사용해보는 방식을 추천해줬다.

 

"오.. 되겠는데?"

는 개뿔 안되더라

 

https://stackoverflow.com/questions/76766307/flutter-upload-file-using-s3-api

 

Flutter: upload file using s3 api

Im trying to upload a file to Cloudflare's R2 database, which uses the s3 api. Im using this package: https://pub.dev/packages/aws_s3_upload code so far: class StorageRepository { Future<Strin...

stackoverflow.com

두번째로 봤던 오버플로우 글이다.

해당 글에서는 S3 upload 비공식 패키지를 사용해서 전송하려는데 안되더라~ 였는데

결국 답변은 위와 비슷했다 endpoint로 명시된 전송 url를 R2 방식으로 교체하라는 거였는데

 

"오~ 되겠는데?"

는 개뿔 또 안되더라

 

https://stackoverflow.com/questions/73943907/cloud-flare-r2-how-to-upload-images

 

Cloud Flare, R2, how to upload images?

Cloud Flare, R2, how to upload images?? I`m new to Cloud Flare world, and I can upload the pictures by dragging but how to upload image using coding? from application?? do I have to use "WORKERS&

stackoverflow.com

세번째로 봤던 오버플로우 글이다.

해당 글에서는 R2를 Flutter 자체에서 전송하는 방식이 아닌 CloudFlare의 Workers를 이용하여

Workers에서 Image를 업로드하는 방법에 대한 질문이었고 답변으로는 변수에 등록된 버킷을 직접 호출하여 put 메소드를 통해 이미지를 업로드하는 방식을 채택하였다.

별거 아니었던 질문이었지만 해당 글을 보고 생각해낸 형태가 workers를 배포하여 url 호출 방식으로 사용하는 방식이었다.

근데 이 경우 Workers 한도를 생각해야 됐지만 별다른(?) 문제가 없다 판단되어 한번 시도해보았었다.

 

1. Workers 호출 시 전달되는 request 인자 안에 method 값을 취득하여 Put으로 전송되었나 확인

2. 이후 request 인자 내 header 값을 추가로 취득하여 content-type 인자를 확인, 이때 form data 형식으로 전송된건지 확인

3. 두 분기문이 합격 시 전달된 data를 arraybuffer() 메소드를 통해 오픈 후 a 변수에 할당

4. 이후 a 변수를 bucket.put(fileName, a) 를 통해 지정된 버킷 변수에 데이터 저장 시도

5. 저장 완료!

 

근데 이 방식으로 사용하려니 두 가지 문제가 있었는데

1. Workers 한도로 인한 비용 문제

2. 다중 업로드 불가 문제

 

그래도 이때는 플러터로 직접 업로드하는 것이 불가능한걸로 알고 있었으니

2번을 해결하기 위해 다중 업로드를 개발해보기로 했다.

이때 수정했던 사항이

- formData로 받아오던 데이터를 단일이 아닌 각각 'data', 'name' 의 이름의 인자로 전송할 것

- 'name' 은 get() 메소드  사용, 'data' 는 getAll()로 가져올 것

- getAll()을 사용한 데이터는 files 변수에 담아줄 것

- 파일의 리스트를 버퍼화 하기 위해 for문의 of 예약어를 통해 files를 순회하며 arraybuffer()를 변환하자 말자 bucket.put 메소드를 통해 이전에 데이터 저장 시도한대로 저장

 

해당 방식을 통해 Workers 한 번 호출로 여러 데이터를 저장할 수 있게 됐다.

결국 최종 방식이

Workers URL 호출 -> request data parsing -> bucket api 다중 호출 -> 업로드 완료

이다.

그렇게 다중 업로드가 가능해졌다.

근데 가장 큰 문제는 workers 호출 + bucket 쓰기로 인한 두 번 연속 호출이 문제였다.
특히나 workers는 무료제공이지만 하루 제공량 10만건이기에 SNS 같은 대량 업로드 트래픽이 일어나는 서비스에서는 큰 문제로 작용할 수 있었다.

거기에 10만건이 많아보이더라도 100명의 접속자가 하루에 10번만 평균적으로 업로드를 진행한다하면적어도 30일 내에 3만건이 사용되는 것이기에 10만건이 부족해질 수 있는 위험은 충분히 있다.

그리고 더 나아가 api 사용 시 url로 사용되기에 혹여 url 유출이 발생하면 무차별 공격이 들어올 수도 있다.

(물론...그런거 신경쓸거면 클라우드 컴퓨팅 쓰는게 맞지만요..)

 

그래서 해당 방법들은 갖고만 있고 플러터 업로드에 대해 다시 연구해보기로 했다.

 

* CloudFlare R2 플러터 내 사용법

R2 flutter가 없다면 aws flutter를 사용하면 그만이라고 생각을 바꾸었다.

그렇게 인증받은 패키지 중 사용하기 편하고 평점 좋은 아래의 패키지를 발견하였다.

 

https://pub.dev/packages/aws_s3_api

 

aws_s3_api | Dart package

AWS API client for Amazon Simple Storage Service (generated from SDK API specification).

pub.dev

앞서 조사했던 바에 따르면 endpointUrl 을 R2로 변경하여 사용해야된다했는데

해당 패키지는 그럴 필요 없이 그냥 있는 그대로 R2 url를 넣어주면 그만이었다.

 

final credentials = AwsClientCredentials(
    accessKey: '액세스 키',
    secretKey: '시크릿 키',
  );
//액세스 키, 시크릿 키는 CloudFlare 대시보드 -> R2 -> R2 API 토큰 관리에서 생성하거나 이미 있는거 확인

final s3Bucket = S3(
		region: 'auto', //CloudFlare R2는 Region이 따로 없으므로 'auto'로 설정합니다.
		endpointUrl: 'https://{어카운트 ID}.r2.cloudflarestorage.com', // 어카운트ID 양옆 중괄호 제거 필요
        // ex) 'https://d33389409c9019c290c092903cc.r2.cloudflarestorage.com'
		credentials: credentials, // 위에서 만든 인증토큰
    );
    
    
final fileBytes = await {얻어온 파일}.readAsBytes(); // ImagePicker 혹은 File 객체 등을 바이트화(중괄호 제거 필요)
await bucket.putObject(bucket: "버킷이름", key: "원하시는 파일 이름(확장자 포함하셔야됩니다.)", body: fileBytes, contentLength: fileBytes.length);

이제 이렇게 보내고 나면 정상적으로 버킷에 파일 업로드 완료!

 

*주의사항*

1. 확장자 없어도 저장은 되나 문제될 수 있음

2. await 없으면 오류날 수 있음

3. 위에 언급한 대괄호는 꼭 제거할 것

 

클라우드 플레어 R2 스토리지 서비스는 10GB 무료 제공에 쓰기 읽기 용량 가격이 모두 착하다.

CloudFlare R2(무료) 무료 제공량 (매 월)
용량 10GB
쓰기 및 수정 100만건
읽기 1000만건

 

무료 제공량임에도 불구하고 용량을 제외하곤 굉~장~히 착한 가격을 보유하고 있다.

근데? 유료 사용가격 또한 굉장히 저렴하다.

 

아래는 무료 사용량을 모두 사용한 뒤 과금되는 유료 금액 내용이다.

CloudFlare R2(유료) 무료 제공량 사용 후 유료 제공량 (매 월)
용량 1GB 당 0.015달러 (24년9월 기준 약 20원)
쓰기 및 수정 100만건 당 4.5달러 (24년 9월 기준 약 6천원)
읽기 1000만건 당 0.36달러 (24년 9월 기준 약 480원)

 

이렇게 될 경우 100명 동시사용자가 하루 10회씩 30일 기준으로 계산할 때

 

업로드 100명 x 100회 x 30일 = 한 달 약 30만건 사용

읽기 100명 x 1000회 x 30일 = 한 달 약 300만건 사용

 

100명이라는 유저가 여유롭게 서비스를 이용한다해도 이론상

쓰기 및 수정 70만건, 읽기 700만건이 남는다.

여기에 사용량에 대한 오차범위가 발생할 수 있다.

(이론은 항상 실전과는 다르니까)

실제로 api를 원래 호출했던 횟수보다 더 높게 나왔었다.

그렇다면 여기에 여유롭게 각각 20만건, 200만건을 사용했다 치더라도

 

한달 약 쓰기 50만건, 읽기 500만건이 남는다.

이정도면 하나의 서비스가 돌아가기에 굉장히 충분하지 않나?

특히나 토이 프로젝트 용도로는 아주아주 부합한다고 생각한다.

 

다만, R2와 DB를 같이 사용하기 위해서 D1 서비스를 주로 사용해야되는데

이 서비스는 SQLite 방식과 동일한 DB이고 제한이 많다보니

실제 DB 사용하는 서비스와는 동일시하게 여겨지기는 힘든 부분이 다소 존재한다.

필자가 추천하는 방식은 R2 + 다른 DB 혹은 Supabase(Postgresql 기반)이다.

 

다음엔 여기에 백엔드 서비스가 또 필요하다면 약 5천원을 추가로 내고 백엔드도 돌릴 수 있는

CloudType 에 관해 설명해보도록하겠다.

(물론 연습용으로 제한적 무료사용이 가능하다.)

티스토리 처음 가입해서 처음 써본건데 봇이라도 있나보다..

덧글과 공감은 쉴 새 없이 달리는데 조회수는 1에서 멈춰있다.

아마 덧글 봇 같은게 존재하는 것 같은데

기분은 좋으니 자기만족용으로 차단하지 않기로 했다(?)

 

이전 포트폴리오 제작 때 웹을 개발해서 배포하고 싶었다.

근데 Github로 배포하자니 Private로 배포가 불가능하고..

그렇다고 공개로 배포하자니 조금 마음에 걸렸다.

 

무료를 좋아하는 나로써 방법이 없을까 싶다가 찾은 글이

https://tilnote.io/pages/64826eaf10b2b51d62a76a29

 

Cloudflare Pages에 Flutter 앱 배포하기

Cloudflare Page는 프론트엔드 프로젝트를 간편하게 배포할 수 있게 도와주는 플랫폼입니다. 빌드 명령어 프리셋으로 React, Vue 등 여러 프레임워크를 지원하고 있지만. Flutter Web은 지원되지 않습니다

tilnote.io

해당 게시글이었다. (물어보지 않고 갖고왔습니다 혹시나 문제되면 삭제하겠습니다.)

 

그러나 나는 누군가? 정말 자랑스러운 바보다.

그렇기에 포스팅대로 시도를 했으나 뭔가 자꾸 안되서 막히고 문제가 생겼었다.

그래서 그냥 간단하게 하기로 했는데

 

클라우드 플레어 접속
https://www.cloudflare.com/ko-kr/

 

대시보드 내 Worker 및 Pages

접속 후 대시보드에서 생성 클릭

 

새로운 Wokrer 및 Pages 생성

생성 시 Workers 가 아닌 Pages 클릭 후 자산 업로드 누르셔서 진행하시면 된다.

이때 업로드할 파일은 Android Studio 기준 터미널에 아래 명령어 입력해주면 된다.

flutter build web --web-renderer html

 

이후 Project Folder - build - web 경로의 만들어진 이 web 폴더를 전체 업로드하면

정상적으로 배포가 완료된다.

 

DB테스트나 동적 테스트 혹은 특정 패키지가 안되는 문제까지는 못겪어봐서 확답은 못하지만

이 방식이면 웹 배포하는데 문제없지 않을까 싶다.

 

다음은 플러터에서 망할 클라우드플레어 R2 사용기이다.. 이거 하느라 이갈았었다.

회사에서 프론트엔드 웹 개발자를 채용하려는데

개발자가 나밖에 없다..

난 앱 개발자다보니 자세한 웹 상식도 잘 모르는 상태인데

SEO니 스토리지니.. 내가 무지한건진 몰라도 잘 모르겠다.

그래서 웹알못 기준으로 면접 질문 준비하는 과정에서 정리도 같이 해보기로 했다.

(feat. 경력이신데도 웹알못이 면접을 진행해드려서 정말 죄송합니다 면접자분들.. 그래도 최대한 잘 아는 척 했습니다..)

 

기술면접 질문(프론트엔드 용)

1. JS관련 다양한 프레임워크와 라이브러리가 존재합니다. 가령 Vue, Angular React 등이 있는데 React를 선택한 이유에 대해서 말씀해주세요.
- 리액트에 대한 이해도와 뷰, 앵귤러에 대한 기본 지식이 있는지 여부에 대해 알기 위한 질문입니다.

2. js 비동기 처리 방식에 async/await 예약어에 대한 설명을 해주세요.
- 비동기 처리방식에 대한 기본 지식을 알기 위한 질문입니다.

 

3. 브라우저 렌더링 원리에 대한 설명을 해주세요.
- 저도 이건 모르는데 하도 유명하길래 물어봤습니다 ㅎ..


4. 타입스크립트를 사용하셨던데 자바스크립트와의 차별점에 대해 설명해주세요.
- 회사에서 타입스크립트 사용 가능자를 요구해서 물어봤습니다.


5. 호이스팅에 대해 설명해주세요.
- js 변수 선언에 대한 지식 중 메모리 적재 시 동작 방식에 대해 알고 있는지 여부를 알기 위해 질문했습니다.
(저도 아는건데 설마 모를까 라는 생각에 질문한 것도 있습니다.)


6. TDD에 대해 설명해주시고 면접자분이 알고계시거나 사용해보신 TDD 도구에 대해 말씀해주세요.
- 사실 모릅니다. 앱은 알아도 TDD 방식이 웹에서도 어떻게 하는진 모르지만 TDD 도구를 사용했을 정도면 기본적인 소프트웨어 개발에 대한 이론 지식은 겸비해있다 생각해서 질문했습니다.


7. 면접자분이 알고계신 개발 시 주로 사용되는 소프트웨어 아키텍쳐 패턴에 대해 말씀해주시고 해당 패턴에 대해 설명해주세요.
- MVVM, MVC, MVP 등에 대한 데이터 통신을 다룰 때 사용되는 유명한 디자인 패턴을 알고 있는지, 알고 있다면 사용해보거나 얼만큼 알고 있는지 여부를 판가름하기 위해 질문하였습니다.


8. 클래스형 컴포넌트와 함수형 컴포넌트의 차이는 무엇인지 말씀해주세요.
- 모릅니다. 그냥 유명한 것 같아 넣어놨습니다..히히..


9. 브라우저 저장소들인 로컬스토리지, 세션스토리지, 쿠키에 대해 각각 설명해주세요.
- 회사에서 웹보다는 앱을 만드는 작업을 많이 합니다. 그러다보니 디바이스 내 저장된 후 웹이 종료되더라도 데이터가 보존되는 로컬 스토리지와 쿠키를 자주 사용했는데 해당 방식에 대한 차이점을 명확히 알고 있고 사용해본 적이 있어야지 최소 합격선에 부합한다 생각하여 질문했습니다.


10. 웹을 앱으로 패키징하는 방식에 대해 아는만큼 설명해주세요.
- 위에서 언급한대로 회사에서는 웹이 아닌 앱을 많이 개발해야됩니다. 그러다보니 앱 패키징에 대한 지식을 어느정도 갖고 있다면 입사 이후 개발에 대해 막히는 선이 없을 것이라 생각되어 질문했습니다.


11. SEO를 적용한 사례 혹은 아는 지식을 설명해주세요.
- 그 저도 저게 뭔지 자세히 모릅니다. 그냥 검색엔진 최적화 정도로 알고 있는데 제가 아는 최적화는 검색 시 최상단에 노출될 확률을 높이기 위해 작업하는 것으로 알고 있는데 회사 동료분은 저게 무슨 몸이 불편하신분들? 에 대한 뭐..그 사용하기 편하도록? 하는 그런거랍니다..근데 찾아보니 그건 웹 접근성 이야기같은데 뭐가 맞는진 모르겠습니다.

 

여기까지가 기술면접 공용 질문이었다.

봤던 면접이 전부 2년차 이상 웹개발자 경력이다보니 사실 공용 질문보다는 개인 맞춤형 질문이 주된 질문이었고
(맞춤형 질문 때문에 매번 회사에서 질문지 만드느라 개고생했다..)

그러다보니 공용 질문의 양이 많지는 않았다.

 

아래는 맞춤형 질문들 모음집이다.

 

기술면접 질문(맞춤형 질문용)

1. 기억에 남는 트러블 슈팅에 관련해 이야기해주세요.
- 모든 사람 다 물어봤습니다. 회사 내에서 문제가 발생할 시 어떻게 대처할 지에 대한 질문입니다.

2. 직접 상태관리 라이브러리를 제작하셨던데 제작하게 된 계기와 제작하신 라이브러리가 타 상태관리 라이브러리와 차별점 혹은 장점에 대해서 설명해주세요.
- 면접자분 중 한분이 직접 상태관리 라이브러리를 개발하신 경험이 있으셨습니다. 그래서 이에 대해 물어봤습니다.

 

3. 주 경험이 리액트 네이티브이시던데 리액트 네이티브 내에서 AOS 혹은 IOS의 네이티브 코드를 호출해보셨나요?
- 사실 웹 개발자면 물어보지 않아도 되는데 자기소개서가 너무 괘씸하게 적혀있어서 절대 안해봤을 질문을 드려봤습니다. 질문 이유는 @ReactMethod 라는 어노테이션 사용 여부 혹은 지식에 대한 질문이었습니다.

4. 코드 난독화 작업을 진행하셨던데 이에 대해 설명해주세요.

- ㅋㅋㅋㅋ 위와 같은 대답입니다. 불필요한 질문이지만 괘씸해서 물어봤습니다.

 

5. 스프링부트 경험이 있으시던데 ERD 설계, API 설계 혹은 백엔드 서비스 개발 등등이 있다면 백엔드 개발에서 어느 부분까지 가능하신가요?
- 풀스택 개발자분이셨습니다. 그래서 백엔드 개발이 어느정도 가능한 지 판가름하기 위해 질문드렸습니다.

6. 프로젝트에 사용하신 DB가 NoSQL 방식을 채택하셨던데 SQL 방식을 사용하시지 않고 해당 방식을 사용하신 이유가 무엇인가요?
- 면접자분 중 한분이 개인프로젝트에 Firebase가 아닌 다른 Key-value 방식의 db를 채택하셨습니다. 그 부분이 너무 흥미로워서 이야기를 듣고자 유도 질문을 드려봤습니다만 사용 이유에는 딱히 이유가 없다는 사실을 알게 되었습니다..

 

7. 프로젝트 기여도가 90%인 프로젝트도 있으시던데 어떤 이유로 그렇게 생각하신걸까요?
- ㅋㅋㅋㅋㅋㅋㅋㅋㅋ 예 많이 괘씸했습니다. 백엔드 개발자 1명 프론트 엔드 개발자 1명(면접자분 예상)인 프로젝트를 경력 기술서에 적어주셨는데 해당 프로젝트에 기여도가 90%이며 타 프로젝트에 (프론트엔드 기준) 이라는 말을 명시해두신 것을 보면 해당 프로젝트의 전체 중 90%를 말씀하신 것 같습니다. 이때 의문이 많이 들었습니다. 6개월도 안되는 시간의 프로젝트를 개발하시는데 90%이면 회사가 문제인걸까? 아니면 프로젝트가 문제였던걸까? 아니면 면접자분이 문제였던걸까? 이를 알기 위해 질문을 드리고자 했으나 런치셨습니다. 다행입니다. 아마 오셨으면 굉장히 호된 질문 많이 받으셨을겁니다.

8. 해당 프로젝트의 로그인 관리에 관해 Auth 테이블을 따로 관리하시는건가요 아니면 일회성 로그인 기능(SNS 로그인)만 사용하셨던건가요?
- 개인 프로젝트에 SNS로그인을 통해 Auth 기능이 따로 있는 Serverless 서비스를 사용하신것을 보았습니다. 근데 계정 관리 테이블에 대한 언급이 없어서 계정 관리는 따로 하시지 않는 것인지에 대한 궁금증에 질문드렸고 돌아온 답변은 세션 관리는 안하나 Account 테이블은 따로 존재하여 해당 부분에 계정 등록은 해주고 있다였습니다.

 

9. 클라우드 컴퓨팅에 대해서 사용해보시거나 아는만큼 설명해주세요.
- 회사에서 신규 사업 상품으로 ServerLess 서비스를 채택하였습니다. 그로 인해 추후 서비스 개발이 가능할 수 있도록  클라우드 컴퓨팅도 사용 가능한 인재를 선출해야되었고 당장 사용을 못하더라도 알고 있거나 가능성이 있거나 혹은 관심이 있는 정도여도 좋아서 물어본 질문이었습니다.

 

10. 백엔드, 앱등 다른 분야에 대한 경험해볼 의향이 있으신가요?
- 위와 같은 상황입니다.

 

면접자 세분은 런을 치셨지만

너무 좋은 선택이었다고 생각한다.

여긴 지옥이 맞으니까 ^v^..

+ Recent posts