쪽지발송 성공
Click here
재능넷 이용방법
재능넷 이용방법 동영상편
가입인사 이벤트
판매 수수료 안내
안전거래 TIP
재능인 인증서 발급안내

🌲 지식인의 숲 🌲

🌳 디자인
🌳 음악/영상
🌳 문서작성
🌳 번역/외국어
🌳 프로그램개발
🌳 마케팅/비즈니스
🌳 생활서비스
🌳 철학
🌳 과학
🌳 수학
🌳 역사
해당 지식과 관련있는 인기재능

 안녕하세요. 안드로이드 기반 개인 앱, 프로젝트용 앱부터 그 이상 기능이 추가된 앱까지 제작해 드립니다.  - 앱 개발 툴: 안드로이드...

안녕하세요.신호처리를 전공한 개발자 입니다. 1. 영상신호처리, 생체신호처리 알고리즘 개발2. 안드로이드 앱 개발 3. 윈도우 프로그램...

소개안드로이드 기반 어플리케이션 개발 후 서비스를 하고 있으며 스타트업 경험을 통한 앱 및 서버, 관리자 페이지 개발 경험을 가지고 있습니다....

iOS 네트워킹: URLSession과 Alamofire 비교

2024-12-06 01:36:53

재능넷
조회수 242 댓글수 0

iOS 네트워킹의 세계로 떠나는 여행: URLSession과 Alamofire 비교 🚀

 

 

안녕하세요, 여러분! 오늘은 iOS 개발자들의 필수 도구인 네트워킹 라이브러리에 대해 깊이 있게 탐구해보려고 합니다. 특히 Apple의 기본 네트워킹 프레임워크인 URLSession과 인기 있는 서드파티 라이브러리 Alamofire를 비교해볼 거예요. 마치 우리가 재능넷에서 다양한 재능을 비교하고 선택하듯이, 이 두 가지 네트워킹 도구의 장단점을 꼼꼼히 살펴보겠습니다. 😊

🔍 오늘의 여정:

  • URLSession과 Alamofire 소개
  • 기본 사용법 비교
  • 고급 기능 탐구
  • 성능 및 효율성 분석
  • 실제 프로젝트에서의 선택 기준

자, 이제 iOS 네트워킹의 흥미진진한 세계로 함께 떠나볼까요? 마치 재능넷에서 새로운 재능을 발견하는 것처럼, 우리도 오늘 새로운 지식의 세계를 탐험해보겠습니다! 🌟

1. URLSession: Apple의 네트워킹 기본기 💪

URLSession은 iOS, macOS, tvOS, watchOS 등 Apple 플랫폼에서 HTTP/HTTPS를 통해 데이터를 주고받을 때 사용하는 기본적인 API입니다. 마치 재능넷에서 기본적인 재능 거래 시스템을 제공하는 것처럼, URLSession은 iOS 앱 개발에서 네트워킹의 기본을 제공합니다.

1.1 URLSession의 주요 특징

  • 네이티브 지원: Apple이 직접 개발하고 유지보수하는 프레임워크입니다.
  • 다양한 세션 타입: 기본, 임시, 백그라운드 세션 등을 제공합니다.
  • 강력한 캐싱 메커니즘: 효율적인 데이터 관리가 가능합니다.
  • 인증 지원: 다양한 인증 방식을 기본적으로 지원합니다.

1.2 URLSession 기본 사용법

URLSession을 사용하여 간단한 GET 요청을 보내는 방법을 살펴보겠습니다. 이는 마치 재능넷에서 특정 재능에 대한 정보를 조회하는 것과 비슷합니다.


let url = URL(string: "https://api.example.com/data")!
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
    if let error = error {
        print("Error: \(error.localizedDescription)")
        return
    }
    
    guard let data = data else {
        print("No data received")
        return
    }
    
    if let result = String(data: data, encoding: .utf8) {
        print("Result: \(result)")
    }
}
task.resume()
  

이 코드는 다음과 같은 단계로 작동합니다:

  1. URL 객체를 생성합니다.
  2. URLSession의 shared 인스턴스를 사용하여 dataTask를 생성합니다.
  3. 완료 핸들러에서 에러 체크, 데이터 확인, 결과 처리를 수행합니다.
  4. task.resume()을 호출하여 네트워크 요청을 시작합니다.

💡 Pro Tip: URLSession은 단순한 요청부터 복잡한 네트워킹 작업까지 다양한 시나리오를 처리할 수 있습니다. 재능넷에서 다양한 재능을 찾을 수 있듯이, URLSession도 다양한 네트워킹 요구사항을 충족시킬 수 있습니다.

1.3 URLSession의 고급 기능

URLSession은 기본적인 요청 외에도 다양한 고급 기능을 제공합니다. 이는 마치 재능넷에서 고급 재능을 찾는 것과 같습니다.

1.3.1 백그라운드 다운로드

앱이 백그라운드 상태일 때도 다운로드를 계속할 수 있는 기능입니다.


let config = URLSessionConfiguration.background(withIdentifier: "com.example.bgdownload")
let session = URLSession(configuration: config, delegate: self, delegateQueue: nil)

let url = URL(string: "https://example.com/largeFile.zip")!
let task = session.downloadTask(with: url)
task.resume()
  

1.3.2 인증 처리

URLSession은 기본적인 인증 메커니즘을 제공합니다. 이는 재능넷에서 안전한 거래를 위한 인증 시스템과 유사합니다.


let config = URLSessionConfiguration.default
config.httpAdditionalHeaders = ["Authorization": "Bearer YOUR_TOKEN_HERE"]
let session = URLSession(configuration: config)
  

1.3.3 캐싱 제어

효율적인 데이터 관리를 위한 캐싱 정책을 설정할 수 있습니다.


let config = URLSessionConfiguration.default
config.requestCachePolicy = .reloadIgnoringLocalCacheData
let session = URLSession(configuration: config)
  

🔍 Deep Dive: URLSession의 고급 기능들은 복잡한 네트워킹 시나리오를 효과적으로 처리할 수 있게 해줍니다. 이는 재능넷에서 복잡한 프로젝트나 특수한 요구사항을 가진 클라이언트의 요청을 처리하는 것과 비슷합니다.

1.4 URLSession의 장단점

장점:

  • 네이티브 지원: Apple 플랫폼과의 완벽한 통합
  • 성능: 최적화된 성능으로 빠른 네트워크 작업 가능
  • 유연성: 다양한 네트워킹 시나리오 지원
  • 안정성: Apple의 지속적인 업데이트와 지원

단점:

  • 복잡성: 간단한 작업에도 상대적으로 많은 코드가 필요할 수 있음
  • 학습 곡선: 초보자에게는 다소 어려울 수 있음
  • 추가 기능 제한: 일부 고급 기능은 직접 구현해야 함

URLSession은 마치 재능넷에서 제공하는 기본적인 거래 시스템과 같습니다. 강력하고 안정적이지만, 때로는 사용하기 복잡할 수 있죠. 하지만 이러한 복잡성은 또한 더 많은 제어와 커스터마이징 가능성을 제공합니다.

URLSession의 구조 URLSession 구조 URLSession URLSessionTask URLSessionDelegate Configuration Data Task Upload Task Download Task

이 다이어그램은 URLSession의 기본 구조를 보여줍니다. URLSession은 여러 URLSessionTask를 관리하며, 이는 Data Task, Upload Task, Download Task 등으로 나뉩니다. 또한 URLSessionDelegate를 통해 세션의 동작을 세밀하게 제어할 수 있습니다.

🎓 학습 포인트: URLSession의 구조를 이해하는 것은 복잡한 네트워킹 작업을 효과적으로 처리하는 데 큰 도움이 됩니다. 마치 재능넷에서 복잡한 프로젝트를 여러 단계로 나누어 관리하는 것과 같습니다.

2. Alamofire: 편리함의 대명사 🚀

Alamofire는 Swift 기반의 HTTP 네트워킹 라이브러리로, URLSession을 기반으로 만들어졌지만 더욱 사용하기 쉽고 강력한 기능을 제공합니다. 마치 재능넷에서 전문가의 도움을 받아 더 쉽고 효율적으로 일을 처리하는 것과 같습니다.

2.1 Alamofire의 주요 특징

  • 간결한 문법: 복잡한 네트워킹 작업을 간단하게 처리할 수 있습니다.
  • 체이닝 요청: 여러 요청을 연결하여 처리할 수 있습니다.
  • 강력한 파라미터 인코딩: JSON, URL 인코딩 등을 쉽게 처리합니다.
  • 자동 검증: 응답 상태 코드와 MIME 타입을 자동으로 검증합니다.

2.2 Alamofire 기본 사용법

Alamofire를 사용하여 간단한 GET 요청을 보내는 방법을 살펴보겠습니다. 이는 재능넷에서 원하는 재능을 쉽게 검색하는 것과 비슷합니다.


import Alamofire

AF.request("https://api.example.com/data").responseJSON { response in
    switch response.result {
    case .success(let value):
        print("Success: \(value)")
    case .failure(let error):
        print("Error: \(error.localizedDescription)")
    }
}
  

이 코드는 다음과 같은 단계로 작동합니다:

  1. Alamofire의 AF 객체를 사용하여 request를 생성합니다.
  2. responseJSON 메서드를 사용하여 JSON 응답을 처리합니다.
  3. switch 문을 사용하여 성공과 실패 케이스를 처리합니다.

💡 Pro Tip: Alamofire는 URLSession보다 더 간결한 코드로 같은 작업을 수행할 수 있습니다. 이는 재능넷에서 전문가의 도움을 받아 복잡한 작업을 더 효율적으로 처리하는 것과 같습니다.

2.3 Alamofire의 고급 기능

Alamofire는 기본적인 요청 외에도 다양한 고급 기능을 제공합니다. 이는 재능넷에서 고급 재능을 활용하는 것과 같습니다.

2.3.1 체이닝 요청

여러 개의 요청을 연속적으로 처리할 수 있습니다.


AF.request("https://api.example.com/user")
    .responseDecodable(of: User.self) { response in
        guard let user = response.value else { return }
        
        AF.request("https://api.example.com/posts", parameters: ["userId": user.id])
            .responseDecodable(of: [Post].self) { response in
                guard let posts = response.value else { return }
                print("User \(user.name) has \(posts.count) posts")
            }
    }
  

2.3.2 업로드와 다운로드

파일 업로드와 다운로드를 쉽게 처리할 수 있습니다.


// 업로드
AF.upload(multipartFormData: { multipartFormData in
    multipartFormData.append(imageData, withName: "image", fileName: "image.jpg", mimeType: "image/jpeg")
}, to: "https://api.example.com/upload")
.responseDecodable(of: UploadResponse.self) { response in
    print(response)
}

// 다운로드
AF.download("https://example.com/file.zip").responseData { response in
    if let data = response.value {
        // 다운로드된 데이터 처리
    }
}
  

2.3.3 인증 처리

Alamofire는 다양한 인증 방식을 쉽게 구현할 수 있습니다.


let headers: HTTPHeaders = [
    "Authorization": "Bearer YOUR_TOKEN_HERE",
    "Accept": "application/json"
]

AF.request("https://api.example.com/protected", headers: headers)
    .responseJSON { response in
        print(response)
    }
  

🔍 Deep Dive: Alamofire의 고급 기능들은 복잡한 네트워킹 작업을 간단하게 만들어줍니다. 이는 재능넷에서 복잡한 프로젝트를 전문가의 도움을 받아 쉽게 해결하는 것과 같습니다.

2.4 Alamofire의 장단점

장점:

  • 간결한 문법: 복잡한 네트워킹 작업을 간단하게 처리
  • 풍부한 기능: 다양한 고급 기능을 쉽게 사용 가능
  • 활발한 커뮤니티: 지속적인 업데이트와 지원
  • 확장성: 다양한 플러그인과 확장 가능

단점:

  • 의존성: 외부 라이브러리에 의존하게 됨
  • 학습 필요: Alamofire만의 특징을 학습해야 함
  • 제어의 제한: 일부 저수준 제어가 어려울 수 있음

Alamofire는 재능넷에서 전문가의 도움을 받는 것과 같습니다. 많은 부분을 자동화하고 편리하게 만들어주지만, 때로는 그 편리함이 제어의 제한으로 이어질 수 있습니다.

Alamofire의 구조 Alamofire 구조 AF Request Response Session URLConvertible ParameterEncoding Validation ResponseSerialization

이 다이어그램은 Alamofire의 기본 구조를 보여줍니다. AF 객체를 통해 Request를 생성하고, 이는 다양한 컴포넌트(Session, URLConvertible, ParameterEncoding 등)를 통해 처리됩니다. 최종적으로 Response를 받아 ResponseSerialization을 통해 데이터를 파싱합니다.

🎓 학습 포인트: Alamofire의 구조를 이해하면 더 효율적으로 네트워킹 작업을 수행할 수 있습니다. 이는 재능넷에서 프로젝트의 구조를 이해하고 효율적으로 작업을 분배하는 것과 유사합니다.

3. URLSession vs Alamofire: 실전 비교 🥊

이제 URLSession과 Alamofire를 실제 상황에서 비교해보겠습니다. 마치 재능넷에서 두 가지 다른 접근 방식을 비교하는 것과 같습니다.

3.1 기본적인 GET 요청

URLSession:


let url = URL(string: "https://api.example.com/data")!
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
    if let error = error {
        print("Error: \(error.localizedDescription)")
        return
    }
    
    guard let data = data else {
        print("No data received")
        return
    }
    
    do {
        if let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] {
            print("Received data: \(json)")
        }
    } catch {
        print("Error parsing JSON: \(error.localizedDescription)")
    }
}
task.resume()
  

Alamofire:


AF.request("https://api.example.com/data").responseJSON { response in
    switch response.result {
    case .success(let value):
        print("Received data: \(value)")
    case .failure(let error):
        print("Error: \(error.  localizedDescription)")
    }
}
  

URLSession은 더 많은 코드가 필요하지만 더 세밀한 제어가 가능합니다. Alamofire는 간결하고 읽기 쉬운 코드를 제공합니다.

3.2 POST 요청 with JSON

URLSession:


let url = URL(string: "https://api.example.com/post")!
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")

let parameters: [String: Any] = ["name": "John Doe", "age": 30]
request.httpBody = try? JSONSerialization.data(withJSONObject: parameters)

let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
    // 응답 처리
}
task.resume()
  

Alamofire:


let parameters: [String: Any] = ["name": "John Doe", "age": 30]
AF.request("https://api.example.com/post", method: .post, parameters: parameters, encoding: JSONEncoding.default)
    .responseJSON { response in
        // 응답 처리
    }
  

Alamofire는 파라미터 인코딩을 자동으로 처리하여 코드를 크게 단순화합니다.

3.3 인증 처리

URLSession:


let url = URL(string: "https://api.example.com/secure")!
var request = URLRequest(url: url)
request.setValue("Bearer YOUR_TOKEN", forHTTPHeaderField: "Authorization")

let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
    // 응답 처리
}
task.resume()
  

Alamofire:


let headers: HTTPHeaders = [
    "Authorization": "Bearer YOUR_TOKEN"
]

AF.request("https://api.example.com/secure", headers: headers)
    .responseJSON { response in
        // 응답 처리
    }
  

두 방식 모두 비슷한 복잡성을 가지지만, Alamofire는 HTTPHeaders 타입을 사용하여 더 명확한 코드를 제공합니다.

3.4 성능 비교

성능 면에서 URLSession과 Alamofire는 큰 차이가 없습니다. Alamofire는 URLSession을 기반으로 만들어졌기 때문입니다. 하지만 몇 가지 차이점이 있습니다:

  • 메모리 사용: URLSession이 약간 더 적은 메모리를 사용할 수 있습니다.
  • 초기화 시간: Alamofire는 추가적인 설정으로 인해 초기화 시간이 조금 더 걸릴 수 있습니다.
  • 대규모 요청 처리: 대량의 동시 요청을 처리할 때는 URLSession이 더 효율적일 수 있습니다.

💡 Pro Tip: 성능이 매우 중요한 앱에서는 URLSession을 사용하는 것이 좋을 수 있습니다. 하지만 대부분의 경우 Alamofire의 편의성이 주는 이점이 더 클 수 있습니다.

3.5 유지보수와 확장성

유지보수와 확장성 측면에서 두 라이브러리를 비교해보겠습니다:

URLSession:

  • 네이티브 지원: Apple의 지속적인 업데이트와 지원을 받습니다.
  • 안정성: 시스템 라이브러리로서 높은 안정성을 제공합니다.
  • 복잡성: 복잡한 네트워킹 작업을 위해서는 추가적인 래퍼 클래스를 만들어야 할 수 있습니다.

Alamofire:

  • 커뮤니티 지원: 활발한 커뮤니티와 지속적인 업데이트가 이루어집니다.
  • 확장성: 다양한 플러그인과 확장이 가능합니다.
  • 의존성: 외부 라이브러리에 의존하게 되어 버전 관리에 주의가 필요합니다.

유지보수와 확장성 면에서는 프로젝트의 특성과 팀의 선호도에 따라 선택이 달라질 수 있습니다.

3.6 학습 곡선

두 라이브러리의 학습 곡선을 비교해보겠습니다:

URLSession:

  • 기본 개념: HTTP 통신의 기본 개념을 이해하는 데 도움이 됩니다.
  • 복잡성: 초보자에게는 다소 어려울 수 있습니다.
  • 문서화: Apple의 공식 문서가 잘 정리되어 있습니다.

Alamofire:

  • 간결성: 빠르게 기본적인 네트워킹 작업을 수행할 수 있습니다.
  • 직관성: 메서드 체이닝 등 직관적인 API를 제공합니다.
  • 추상화: 일부 저수준 개념을 이해하기 어려울 수 있습니다.

초보자에게는 Alamofire가 더 접근하기 쉬울 수 있지만, 장기적으로는 URLSession의 기본 개념을 이해하는 것이 중요합니다.

🎓 학습 전략: 처음에는 Alamofire로 시작하여 네트워킹의 기본을 익히고, 점차 URLSession의 개념을 학습하는 것이 효과적일 수 있습니다. 이는 재능넷에서 기본적인 재능부터 시작해 점차 고급 재능을 습득하는 것과 유사합니다.

4. 결론: 어떤 것을 선택해야 할까? 🤔

URLSession과 Alamofire 중 어떤 것을 선택해야 할지는 프로젝트의 요구사항, 팀의 경험, 그리고 개인의 선호도에 따라 달라집니다. 여기 몇 가지 고려사항을 제시합니다:

URLSession을 선택해야 할 때:

  • 네이티브 솔루션 선호: Apple의 공식 프레임워크를 사용하고 싶을 때
  • 세밀한 제어 필요: 네트워크 작업을 더 세밀하게 제어해야 할 때
  • 의존성 최소화: 외부 라이브러리 의존성을 최소화하고 싶을 때
  • 성능 최적화: 극도로 성능에 민감한 앱을 개발할 때

Alamofire를 선택해야 할 때:

  • 빠른 개발: 신속하게 프로토타입을 만들거나 개발 속도가 중요할 때
  • 코드 간결성: 더 간결하고 읽기 쉬운 코드를 원할 때
  • 고급 기능 필요: 다양한 고급 네트워킹 기능을 쉽게 사용하고 싶을 때
  • 팀 경험: 팀이 이미 Alamofire에 익숙할 때

💡 최종 조언: 두 라이브러리 모두 장단점이 있습니다. 가장 좋은 접근 방식은 두 가지를 모두 학습하고, 상황에 따라 적절한 도구를 선택하는 것입니다. 마치 재능넷에서 다양한 재능을 익히고 상황에 맞는 재능을 선택하는 것처럼 말이죠.

결론적으로, URLSession과 Alamofire는 각각의 장점을 가지고 있습니다. URLSession은 Apple의 공식 프레임워크로서 안정성과 세밀한 제어를 제공하며, Alamofire는 사용의 편의성과 풍부한 기능을 제공합니다. 개발자로서 우리의 역할은 프로젝트의 요구사항을 정확히 파악하고, 그에 맞는 최적의 도구를 선택하는 것입니다.

네트워킹은 현대 앱 개발에서 핵심적인 부분입니다. URLSession과 Alamofire를 마스터함으로써, 우리는 더 강력하고 효율적인 iOS 앱을 개발할 수 있습니다. 마치 재능넷에서 다양한 재능을 조합하여 멋진 프로젝트를 완성하는 것처럼, 우리도 이 도구들을 적재적소에 활용하여 훌륭한 앱을 만들어 낼 수 있을 것입니다.

여러분의 iOS 개발 여정에 이 글이 도움이 되었기를 바랍니다. 항상 학습하고, 실험하고, 성장하세요. 그리고 가장 중요한 것은, 코딩을 즐기는 것입니다! 행운을 빕니다! 🚀👨‍💻👩‍💻

관련 키워드

  • iOS
  • 네트워킹
  • URLSession
  • Alamofire
  • Swift
  • HTTP
  • REST API
  • JSON
  • 비동기 프로그래밍
  • 성능 최적화

지적 재산권 보호

지적 재산권 보호 고지

  1. 저작권 및 소유권: 본 컨텐츠는 재능넷의 독점 AI 기술로 생성되었으며, 대한민국 저작권법 및 국제 저작권 협약에 의해 보호됩니다.
  2. AI 생성 컨텐츠의 법적 지위: 본 AI 생성 컨텐츠는 재능넷의 지적 창작물로 인정되며, 관련 법규에 따라 저작권 보호를 받습니다.
  3. 사용 제한: 재능넷의 명시적 서면 동의 없이 본 컨텐츠를 복제, 수정, 배포, 또는 상업적으로 활용하는 행위는 엄격히 금지됩니다.
  4. 데이터 수집 금지: 본 컨텐츠에 대한 무단 스크래핑, 크롤링, 및 자동화된 데이터 수집은 법적 제재의 대상이 됩니다.
  5. AI 학습 제한: 재능넷의 AI 생성 컨텐츠를 타 AI 모델 학습에 무단 사용하는 행위는 금지되며, 이는 지적 재산권 침해로 간주됩니다.

재능넷은 최신 AI 기술과 법률에 기반하여 자사의 지적 재산권을 적극적으로 보호하며,
무단 사용 및 침해 행위에 대해 법적 대응을 할 권리를 보유합니다.

© 2024 재능넷 | All rights reserved.

댓글 작성
0/2000

댓글 0개

해당 지식과 관련있는 인기재능

안녕하세요. 경력 8년차 프리랜서 개발자 입니다.피쳐폰 2g 때부터 지금까지 모바일 앱 개발을 전문적으로 진행해 왔으며,신속하 정확 하게 의뢰하...

 운영하는 사이트 주소가 있다면 사이트를 안드로이드 앱으로 만들어 드립니다.기본 5000원은 아무런 기능이 없고 단순히 html 페이지를 로딩...

애플리케이션 서비스 안녕하세요. 안드로이드 개발자입니다.여러분들의 홈페이지,블로그,카페,모바일 등 손쉽게 어플로 제작 해드립니다.요즘...

📚 생성된 총 지식 10,199 개

  • (주)재능넷 | 대표 : 강정수 | 경기도 수원시 영통구 봉영로 1612, 7층 710-09 호 (영통동) | 사업자등록번호 : 131-86-65451
    통신판매업신고 : 2018-수원영통-0307 | 직업정보제공사업 신고번호 : 중부청 2013-4호 | jaenung@jaenung.net

    (주)재능넷의 사전 서면 동의 없이 재능넷사이트의 일체의 정보, 콘텐츠 및 UI등을 상업적 목적으로 전재, 전송, 스크래핑 등 무단 사용할 수 없습니다.
    (주)재능넷은 통신판매중개자로서 재능넷의 거래당사자가 아니며, 판매자가 등록한 상품정보 및 거래에 대해 재능넷은 일체 책임을 지지 않습니다.

    Copyright © 2024 재능넷 Inc. All rights reserved.
ICT Innovation 대상
미래창조과학부장관 표창
서울특별시
공유기업 지정
한국데이터베이스진흥원
콘텐츠 제공서비스 품질인증
대한민국 중소 중견기업
혁신대상 중소기업청장상
인터넷에코어워드
일자리창출 분야 대상
웹어워드코리아
인터넷 서비스분야 우수상
정보통신산업진흥원장
정부유공 표창장
미래창조과학부
ICT지원사업 선정
기술혁신
벤처기업 확인
기술개발
기업부설 연구소 인정
마이크로소프트
BizsPark 스타트업
대한민국 미래경영대상
재능마켓 부문 수상
대한민국 중소기업인 대회
중소기업중앙회장 표창
국회 중소벤처기업위원회
위원장 표창