1. google 콘솔 회원가입

- Google Console URL : https://cloud.google.com/cloud-console/

 

Cloud Console - Web UI Admin  |  Google Cloud

Cloud Console에서 데이터 분석, VM, Datastore, 데이터베이스, 네트워킹, 개발자 서비스 등 클라우드 애플리케이션의 모든 것을 관리하세요.

cloud.google.com

 새로 가입할경우 90일동안 무료 체험할수있는 크레딧을 제공합니다. 90일 이후 체험 권한은 만료되며, 유료로 전환되지 않습니다. 90일 안에 이것저것 많이 테스트 해봅시다.

 

2. API 설정

아이디를 생성, 로그인 했다면 콘솔 검색창에 google people api를 검색후 '사용'버튼을 눌러줍니다.

왼쪽 상단의 메뉴바 선택 > API 및 서비스탭 > 사용자 인증 정보 클릭

사용자 인증 정보 만들기 클릭> API키 클릭하면 API가 자동으로 생성됩니다. 이때 생성된 API Key를 복사해둡니다.

 

 사용자 인증 정보 만들기 클릭> OAuth 클라이언트 ID 클릭

로그인 인증을 사용할 애플리케이션 유형을 선택합니다.

- 승인된 자바스크립트 원본 : 웹 애플리케이션을 호스팅하는 HTTP 원본입니다.

- 승인된 리디렉션 URI : 인증 후 리디렉션될 경로 입니다.

생성된 클라이언트 ID와 클라이언트 보안 비밀번호를 잘 저장해둡시다.

다음으로 OAuth 사용자 인증을 사용할 **테스트 사용자를 지정해 줍시다.

왼쪽 탭에서 OAuth 동의화면 선택> 차례대로 테스트 앱 관련 정보를 기입한후 '저장 후 계속'을 눌러줍니다.

범위 > 범위 추가 또는 삭제 선택 후 People API에서 사용하고자 하는 정보를 선택하여 범위를 추가합니다.

범위 선택이 완료 되었다면 '저장 후 계속'버튼을 클릭하여 테스트 사용자 단계로 넘어갑니다.

 '+ ADD USERS' 를 클릭해 테스트 환경에서 사용할 사용자(gmail user)를 추가합니다.

다음 리스트를 기준으로 예제를 진행합니다.

List<OrderMenu> Menus = new List<OrderMenu>();
Menus.Add(new OrderMenu { MenuId = 1, OrderId = 1, MenuName = "샐러드", MenuCnt = 2 });
Menus.Add(new OrderMenu { MenuId = 2, OrderId = 1, MenuName = "아이스아메리카노", MenuCnt = 4 });
Menus.Add(new OrderMenu { MenuId = 3, OrderId = 1, MenuName = "에그샌드위치", MenuCnt = 1 });
Menus.Add(new OrderMenu { MenuId = 4, OrderId = 1, MenuName = "치킨샌드위치", MenuCnt = 2 });
Menus.Add(new OrderMenu { MenuId = 5, OrderId = 2, MenuName = "짬뽕", MenuCnt = 1 });
Menus.Add(new OrderMenu { MenuId = 6, OrderId = 2, MenuName = "짜장면", MenuCnt = 3 });

6. Projection Operators(투영 연산자)

: 집합 요소를 재 구성 합니다.

  • Select : 기준인스턴스의 type 그대로 반환합니다.
    //.Select(반환할 형태)
    var useSelectMenu = Menus.Where(o => o.OrderId == 2)
                              .Select(o => new { Restaurantype = "중국집", Menu = o.MenuName }); //new -> 개체가 생성됨.; 
    foreach (var item in useSelectMenu) 
      Console.WriteLine(JsonConvert.SerializeObject(item));
    
    //==========================================OUTPUT=========================================
    //{"Restaurantype":"중국집","Menu":"짬뽕"}
    //{"Restaurantype":"중국집","Menu":"짜장면"}​
  • SelectMany : Select할 요소 type으로 반환합니다. 

Select vs SelectMany

: OrderMenu가 IEnumerable<OrderOption> Options 속성을 가지고 있을경우

Menus.Select(o => o.Options)는 IEnumerable<IEnumerable<OrderOption>>을 반환하고, 

Menus.SelectMany(o => o.Options)는 IEnumerable<OrderOption>을 반환합니다.

 

7. Quantifier Operators (정량자 연산자)

: 특정 조건에서 시퀀스 요소를 평가하고 일부 또는 모든 요소가 조건을 충족함을 나타내는 bool값을 반환하게 됩니다.

  • All : 전체가 해당 조건에 부합하면 True, 부합하지 않으면 False를 반환합니다.
var useAllMenus = Menus.All(o => o.OrderId == 1);
Console.WriteLine("전체가 1번주문 인가요? : " + useallmenus);

//==========================================OUTPUT=========================================
//전체가 1번주문 인가요? : False
  • Any : 일부가 해당 조건에 부합하는지. 부합하면 True, 부합하지 않으면 False를 반환합니다.
var useAnyMenus= Menus.All(o => o.OrderId == 1);
Console.WriteLine("주문중에 1번주문이 있나요? :" + useAnyMenus);

//==========================================OUTPUT=========================================
//주문중에 1번주문이 있나요? : True
  • Contains : 찾고자 하는 요소가 하나라도 있는지 여부를 확인하고 bool반환 합니다.
IList<int> intList = new List<int>() { 1, 2, 3, 4, 5 };
Console.WriteLine($"intList.Contains(1) : {intList.Contains(1)} // intList.Contains(6) : {intList.Contains(6)}");

//==========================================OUTPUT=========================================
//intList.Contains(1) : True // intList.Contains(6) : False
//Class끼리 비교할경우 항상 false 반환
//Why? Contains 확장 메서드가 객체의 참조만 비교하고 객체의 실제 값은 비교하지 않기 때문.
//IEqualityComparer를 구현하여 비교하는 클래스 생성 필요 FuntionalTest.Models-> MenuComparer
    
OrderMenu sameMenu = new OrderMenu() { MenuId = 1, OrderId = 1, MenuName = "샐러드" };
Console.WriteLine("같은 메뉴가 있나요? : " + Menus.Contains(sameMenu, new MenuComparer()));
//==========================================OUTPUT=========================================
//같은 메뉴가 있나요? : True
class MenuComparer : IEqualityComparer<OrderMenu>
    {
        public bool Equals(OrderMenu x, OrderMenu y)
        {
            if (x.MenuId == y.MenuId &&
                        x.MenuName.ToLower() == y.MenuName.ToLower())
                return true;

            return false;
        }

        public int GetHashCode(OrderMenu obj)
        {
            return obj.GetHashCode();
        }
    }

'C#' 카테고리의 다른 글

[C#] Linq 2. 그룹 연산자, 조인 연산자  (0) 2022.01.16
[C#] Linq 1.필터링, 정렬 연산자  (0) 2022.01.09

 

 

다음 리스트를 기준으로 예제를 진행합니다.

List<OrderMenu> Menus = new List<OrderMenu>();
Menus.Add(new OrderMenu { MenuId = 1, OrderId = 1, MenuName = "샐러드", MenuCnt = 2 });
Menus.Add(new OrderMenu { MenuId = 2, OrderId = 1, MenuName = "아이스아메리카노", MenuCnt = 4 });
Menus.Add(new OrderMenu { MenuId = 3, OrderId = 1, MenuName = "에그샌드위치", MenuCnt = 1 });
Menus.Add(new OrderMenu { MenuId = 4, OrderId = 1, MenuName = "치킨샌드위치", MenuCnt = 2 });
Menus.Add(new OrderMenu { MenuId = 5, OrderId = 2, MenuName = "짬뽕", MenuCnt = 1 });
Menus.Add(new OrderMenu { MenuId = 6, OrderId = 2, MenuName = "짜장면", MenuCnt = 3 });

 

4. Grouping Operators(그룹 연산자)

:그룹화 연산자는 지정된 키를 기반으로 요소 그룹을 작성합니다.

  • GroupBy : 선택 필드로 collection을 그룹화합니다.
  • ToLookup : GroupBy와 거의 같으나, GroupBy는 **지연 실행이며, ToLokkup은 즉시 실행됩니다.
var usetGroupByMenu = Menus.GroupBy(o => o.OrderId);
foreach (var menu in usetGroupByMenu)
{
    Console.WriteLine($"OrderId : {menu.Key} ");
    int memcnt = 1;
    foreach (var member in menu)
    {
        Console.WriteLine($"         Member {memcnt++} :" + JsonConvert.SerializeObject(member) );
    }
}

//==========================================OUTPUT=========================================
//OrderId : 1
//         Member 1 :{"MenuId":1,"OrderId":1,"MenuName":"샐러드","MenuCnt":2,"Options":[]}
//         Member 2 :{"MenuId":2,"OrderId":1,"MenuName":"아이스아메리카노","MenuCnt":4,"Options":[]}
//         Member 3 :{"MenuId":3,"OrderId":1,"MenuName":"에그샌드위치","MenuCnt":1,"Options":[]}
//         Member 4 :{"MenuId":4,"OrderId":1,"MenuName":"치킨샌드위치","MenuCnt":2,"Options":[]}
//OrderId : 2
//         Member 1 :{"MenuId":5,"OrderId":2,"MenuName":"짬뽕","MenuCnt":1,"Options":[]}
//         Member 2 :{"MenuId":6,"OrderId":2,"MenuName":"짜장면","MenuCnt":3,"Options":[]}

*초기화 지연

: 개체 초기화 지연은 개체를 처음 사용할 때까지 생성이 지연된다는 의미 입니다.

초기화 지연은 주로 성능을 향상 시키고 불필요한 계산을 방지하고 프로그램 메모리 요구 사항을 줄이는데 사용됩니다.

만드는데 비용이 많이 드는 개체가 있으며, 프로그램에서 이 개체를 사용하지 않는 경우가 있습니다(ex. Orders). 사용자는 주문을 표시하거나 계산에서 데이터를 사용하도록 요청하지 않으면 시스템 메모리 또는 계산 주기를 사용하여 만들 이유가 없습니다. Lazy<Orders>를 사용하여 Orders개체의 초기화 지연을 선언하면 개체를 사용하지 않을 때 시스템 리소스 낭비를 방지할 수 있습니다.

Lazy<Orders> _orders = new Lazy<Orders>();

지연 개체를 만들고 나면 지연 변수의 Value 속성에 처음으로 액세스할 때까지 Orders의 인스턴스가 생성되지 않습니다. 처음 액세스할 때 래핑된 형식이 생성되고 반환되며 나중에 액세스하는 데 사용하기 위해 저장됩니다.

 

5. Joining Operator(조인 연산자)

:두 시퀀스를 결합합니다

 

다음은 Joining Operator 예시에 사용될 추가 조합 입니다.

List<OrderOption> orderOptions = new List<OrderOption>();
orderOptions.Add(new OrderOption { MenuId = 2, OptionId = 1, OptionName = "헤이즐넛 시럽추가", OptionCnt = 1 });
orderOptions.Add(new OrderOption { MenuId = 2, OptionId = 2, OptionName = "사이즈업", OptionCnt = 1 });

 

  • Join : 두 시퀀스를 InnerJoin으로 결합하고 결과를 생성합니다.
var innerJoin = Menus.Join( //outer sequence
    orderOptions, //inner sequnce
    menus => menus.MenuId, //outerKeySelector
    options => options.MenuId, //innerKeySelector
    (menus, options) => new OrderMenu
    {
        MenuId = menus.MenuId,
        MenuName = menus.MenuName,
        OrderId = menus.OrderId,
        Options = new List<OrderOption> { options },
    }); ;//result selector
    
foreach (var menu in innerJoin)
  Console.WriteLine(JsonConvert.SerializeObject(menu));

//==========================================OUTPUT=========================================
//{"MenuId":2,"OrderId":1,"MenuName":"아이스아메리카노","MenuCnt":0,"Options":[{"OptionId":1,"MenuId":2,"OptionName":"헤이즐넛 시럽추가","OptionCnt":1}]}
//{"MenuId":2,"OrderId":1,"MenuName":"아이스아메리카노","MenuCnt":0,"Options":[{"OptionId":2,"MenuId":2,"OptionName":"사이즈업","OptionCnt":1}]}

 

  • GroupJoin : 키에 따라 두 시퀀스를 조인하고 일치하는 키로 결과를 그룹화한 다음 그룹화된 결과 및 키의 컬렉션을 반환합니다.
var groupJoin = Menus.GroupJoin(
    orderOptions,
    menu => menu.MenuId,
    option => option.MenuId,
    (menu, resultGroup) => new
    {
        Menus = resultGroup,
        MenuInfo = menu
    });
    
foreach (var menu in groupJoin)
{
    Console.WriteLine(" ▶ Menu : " + groupjoinmenu.MenuInfo.MenuName);
    foreach (var option in menu.Menus)
    {
        Console.WriteLine("   + "+ JsonConvert.SerializeObject(option));
    }
}

//==========================================OUTPUT=========================================
// ▶ Menu : 샐러드
// ▶ Menu : 아이스아메리카노
//   + {"OptionId":1,"MenuId":2,"OptionName":"헤이즐넛 시럽추가","OptionCnt":1}
//   + {"OptionId":2,"MenuId":2,"OptionName":"사이즈업","OptionCnt":1}
// ▶ Menu : 에그샌드위치
// ▶ Menu : 치킨샌드위치
// ▶ Menu : 짬뽕
// ▶ Menu : 짜장면

 

'C#' 카테고리의 다른 글

[C#] Linq 3. 투영 연산자, 정량자 연산자  (0) 2022.01.23
[C#] Linq 1.필터링, 정렬 연산자  (0) 2022.01.09

1. Linq란? 

 LINQ는 SQL 문과 비슷하게 질의식의 추가를 데이터를 편리하게 추출하고 가공하기 위해 사용할 수 있습니다.

 

다음 리스트를 기준으로 예제를 진행합니다.

List<OrderMenu> Menus = new List<OrderMenu>();
Menus.Add(new OrderMenu { MenuId = 1, OrderId = 1, MenuName = "샐러드", MenuCnt = 2 });
Menus.Add(new OrderMenu { MenuId = 2, OrderId = 1, MenuName = "아이스아메리카노", MenuCnt = 4 });
Menus.Add(new OrderMenu { MenuId = 3, OrderId = 1, MenuName = "에그샌드위치", MenuCnt = 1 });
Menus.Add(new OrderMenu { MenuId = 4, OrderId = 1, MenuName = "치킨샌드위치", MenuCnt = 2 });
Menus.Add(new OrderMenu { MenuId = 5, OrderId = 2, MenuName = "짬뽕", MenuCnt = 1 });
Menus.Add(new OrderMenu { MenuId = 6, OrderId = 2, MenuName = "짜장면", MenuCnt = 3 });

 

2. Filtering Operation(필터링 연산자).

: 조건에 따라 시퀀스를 필터링합니다.

 

2-1) Where : 조건에 부합하는 값들을 반환합니다.

//OrderMenu중 OrderId가 1인 IEnumarable<OrderMenu>를 반환합니다
var useWhereMenus = Menus.Where(o => o.OrderId.Equals(1)) 
                                .Where(o => o.MenuCnt > 1);

foreach (var menu in useWhereMenus )  
  Console.WriteLine(JsonConvert.SerializeObject(menu));

//==========================================OUTPUT=========================================
//{"MenuId":1,"OrderId":1,"MenuName":"샐러드","MenuCnt":2,"Options":[]}
//{"MenuId":2,"OrderId":1,"MenuName":"아이스아메리카노","MenuCnt":4,"Options":[]}
//{"MenuId":4,"OrderId":1,"MenuName":"치킨샌드위치","MenuCnt":2,"Options":[]}

2-2) OfType : 타입에 해당하는 값들을 반환합니다.

IList tmpList = new ArrayList();
tmpList.Add(1);
tmpList.Add(2);
tmpList.Add("string");
tmpList.Add(3);
tmpList.Add("salad");

var useOfTypeList = tmpList.OfType<int>();
foreach(var intTypeItem in useOfTypeList) 
  Console.WriteLine(intTypeItem);

//==========================================OUTPUT=========================================
// 1 
// 2
// 3

 

3. Sorting Operators (정렬 연산자)

:집합요소를 오름차순 또는 내림차순으로 정렬합니다.

  • OrderBy : 지정된 필드를 기준으로 오름차순 정렬합니다.
  • OrderByDescending : 지정된 필드를 기준으로 내림차순 정렬합니다.
  • ThenBy : 우선 정렬된 기준값이 같을경우 다음 기준을 토대로 오름차순 정렬합니다.
  • ThenByDescending : 우선 정렬된 기준값이 같을경우 다음 기준을 토대로 내림차순 정렬합니다.
var useOrderBy = Menus.OrderBy(o => o.OrderId) 
                       .ThenByDescending(o=>o.MenuCnt); 
foreach(var menu in useOrderBy) 
  Console.WriteLine(JsonConvert.SerializeObject(menu));

//==========================================OUTPUT=========================================
//{"MenuId":2,"OrderId":1,"MenuName":"아이스아메리카노","MenuCnt":4,"Options":[]}
//{"MenuId":1,"OrderId":1,"MenuName":"샐러드","MenuCnt":2,"Options":[]}
//{"MenuId":4,"OrderId":1,"MenuName":"치킨샌드위치","MenuCnt":2,"Options":[]}
//{"MenuId":3,"OrderId":1,"MenuName":"에그샌드위치","MenuCnt":1,"Options":[]}
//{"MenuId":6,"OrderId":2,"MenuName":"짜장면","MenuCnt":3,"Options":[]}
//{"MenuId":5,"OrderId":2,"MenuName":"짬뽕","MenuCnt":1,"Options":[]}

 

'C#' 카테고리의 다른 글

[C#] Linq 3. 투영 연산자, 정량자 연산자  (0) 2022.01.23
[C#] Linq 2. 그룹 연산자, 조인 연산자  (0) 2022.01.16

+ Recent posts