3차 멘토링

별빛사막·2025년 3월 6일
0

1. 코틀린으로 변환했을 때의 이점 🌟

  • 자바와 코틀린은 호환되므로 점진적으로 변환 가능
  • 코틀린은 널포인트익셉션(NPE) 발생이 적음
  • 확장 함수를 활용하여 기존 클래스에 기능 추가 가능
  • 자바보다 간결한 코드 작성 가능 → but, 요즘은 java 버전이 ↑ 거의 개선됨
  • 코루틴 등 다양한 기능 제공

✅ 코루틴이 뭐지?
: 코틀린에서 제공하는 비동기 프로그래밍을 위한 경량 스레드임.

🚀 예제 2: 네트워크 요청 (API 1000개 호출) - Java vs Kotlin Coroutine

API를 1000번 호출하는 상황을 가정하고 Java와 Kotlin에서 각각 구현했을 때 성능을 비교해본다.
Java에서는 ExecutorService를 사용하여 멀티스레딩을 구현하고, Kotlin에서는 Coroutine을 사용하여 비동기적으로 실행한다.


💥 Java (ExecutorService 사용)

import java.util.concurrent.*;

public class JavaApiRequest {
    public static void main(String[] args) throws InterruptedException {
        ExecutorService executor = Executors.newFixedThreadPool(100);
        long startTime = System.currentTimeMillis();

        for (int i = 0; i < 1000; i++) {
            executor.execute(() -> {
                try {
                    Thread.sleep(500); // API 요청을 시뮬레이션
                    System.out.println("API 요청 완료 (Thread: " + Thread.currentThread().getName() + ")");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        }

        executor.shutdown();
        executor.awaitTermination(10, TimeUnit.SECONDS);
        long endTime = System.currentTimeMillis();
        System.out.println("Total execution time: " + (endTime - startTime) + "ms");
    }
}

🔹 문제점

  • 스레드 풀 크기(100개) 제한으로 인해 동시 요청이 제한적이다.
  • 스레드 컨텍스트 스위칭 비용이 발생하여 속도가 느려진다.
  • Thread.sleep(500)을 사용하여 스레드가 불필요하게 블로킹된다.

💡 Kotlin (Coroutine 사용)

import kotlinx.coroutines.*
import kotlin.system.measureTimeMillis

fun main() = runBlocking {
    val time = measureTimeMillis {
        val jobs = List(1000) {
            launch(Dispatchers.IO) {
                delay(500L) // API 요청을 시뮬레이션
                println("API 요청 완료 (Coroutine: ${Thread.currentThread().name})")
            }
        }
        jobs.forEach { it.join() }
    }
    println("Total execution time: ${time}ms")
}

🔹 장점

  • Dispatchers.IO를 사용하여 비동기적으로 실행되므로 스레드 제한 없이 많은 요청을 처리할 수 있다.
  • delay(500L)을 사용하여 스레드를 차단하지 않고 효율적으로 실행한다.
  • 코루틴 컨텍스트 스위칭 비용이 적어 성능이 향상된다.

🔥 Java vs Kotlin Coroutine 성능 비교

Java (Thread 사용)Kotlin (Coroutine 사용)
실행 방식ExecutorService를 사용하여 스레드 풀 생성launch를 사용하여 경량 코루틴 실행
동시 실행 가능 개수제한적 (스레드 풀 크기에 따라 결정)무제한 (스레드보다 가벼움)
컨텍스트 스위칭 비용높음 (스레드 간 전환 비용 발생)낮음 (코루틴 컨텍스트 전환 최적화)
메모리 사용량높음 (스레드당 메모리 할당 필요)낮음 (코루틴은 스택 메모리를 적게 사용)
지연 작업Thread.sleep()으로 인해 블로킹 발생delay()를 사용하여 비동기 실행
처리 속도5~10초 소요 (스레드 스케줄링 영향)1초 소요 (코루틴 최적화)

Q. 실무에서 코틀린과 자바 혼용해서 쓰기도 하나?
A. 일부 기업에서는 혼용 가능
멘토님 회사의 경우도 스칼라→ 코틀린으로 전환함( 코틀린이 레퍼런스가 더 많아서 )

2. 코틀린으로 전환하는 방식

  • 서비스 단위로 변경 가능
  • DTO도 단계적으로 변환 가능
  • 데이터 클래스 활용 추천
    Tip) AI를 활용한 PR리뷰를 통해 코틀린스러운 코드인지 질문해보기!
    Tip) IDE에서 제미나이(Gemini) 활용 추천 다운 링크

3. 사이드 프로젝트 및 실무 경험

  • 실제 현업에서도 업무량에 따라 사이드 프로젝트 진행 가능
    개인 프로젝트가 물경력이 되는 것을 방지하기 위해 노력 필요
    성공 사례: 사이드 프로젝트(소개팅 앱)로 높은 수익을 올려 퇴사 후 창업한 사례 존재
    단, 앱 개발 시 약관 동의, 개인정보 처리 등 민감 정보 처리 경험 필요

4. 배포 관련 비용 문제

  • 프로젝트 규모에 따라 비용 발생 가능
    초기에는 무료 프리티어 활용 가능
    오라클 클라우드 프리티어(VM 2개 제공)
    → 사이드 프로젝트로 사용(오라클 VM에 DB 올려서 사용) 추천!!!

    MySQL은 무료가 없지만 MongoDB 무료 버전 존재

5. MongoDB와 Redis 비교 🌟

  • Redis : 휘발성 메모리 기반, 영속성 없음, single 쓰레드 기반이라 사용 시 주의
    → DB가 아니다!!!!!
  • MongoDB : 디스크 저장, 데이터 처리 및 집계 기능 제공, 트랜잭션 및 ACID 중 몇가지 지킴

6. 취업 시 자바, 코틀린 vs Node.js, Python

  • 한국에서는 자바 & 스프링이 대세
  • Python은 데이터 처리 및 AI 관련 분야에서 사용
  • Node.js는 풀스택 역할 요구하는 경우 많음 → 풀스택 바라는 곳은 가지마...
  • 그래도 가고 싶은 특정 기업이 요구하는 기술이 있다면 학습 필요

ex. 한국에서는 코볼(COBOL)거의 사용 안하지만, 미국에서는 시니어 개발자 부족으로 높은 연봉으로 모셔가는 사례가 생김

7. 사이드 프로젝트 경험

  • 꾸준한 사이드 프로젝트 진행 추천
  • Task 관리의 경우, 트렐로(Trello) 추천
  • WebSocket 을 활용한 프로젝트도 해보면 좋다!

ex. 멘토님의 경우, 게임 관련 앱을 개발해 6개월간 광고 수익 450만 원 달성 경험O
→ 애드센스 적극 활용하길 추천!

profile
조금씩 매일 성장하자

0개의 댓글