교육연구실 상담

취업지원팀

051 -927 -9911

이력서 자기소개서 기술소개서

8 / 12 까지 담임선생님께 제출

ksh122075@gmail.com

 

모르는 번호로 오는 경우가 있다

교육 중에도 오는 경우가 있다

카톡 또는 문자가 올경우 답변

 

이력서

희망연봉 - 회사내규에 따름
사진 - 정장
주민번호 - 앞자리만
사회생활 - 보여줄만한건 긴거
전화번호 - 오타없이
주소 - 집이 가까운 사람 선호 (이사 가능)
블로그 - 프로그래밍 관련 블로그 (제이본)
포트폴리오 - 포트폴리오 주소(블로그나 깃)
학력 - 대학교 밑에 고등학교
사회활동 - 오래 일했던 것, 아르바이트 (웬만하면 1년이상, 또는 인턴 계약직, 퇴사사유)
활동사항 - 사회활동이 없을 경우 사회활동을 지우고 입력
군복무사항 - 입력
자격증 - 정보처리기사(필기 실기 등 입력), 운전면허증, 어학
교육이수 - 교육명, 교육기관명, 배운내용
수상경력 - 공모전 등

자신에게 유리한 양식 선택

잡사이트 통해서 지원시 수행한 프로젝트 언급

 

자기소개서

각 항목별 포인트를 설정하고 그것에 대한 살을 붙이자

리더십 보다는 서포터능력 협업 등을 강조

성장과정 - 특별히 남달랐던 부분만을 핵심적으로 기재 (매크로경력 등)
성격의 장단점 - 업무와 관련된 장점(진지함, 끝없는 탐구, 소통, 배려) / 업무에 방해가 되는 단점은 적지말 것 + 개선점
사회생활 - 사회활동 활동사항 등을 구체적으로 작성
지원동기 - 프로그래밍 만의 지원동기, 전문적인 용어 써도됨, 경력관련 내용,
입사후포부 - 회사홈페이지 참고, (공통지원서 제출시에는 '회사'로 통일)

프로그래밍 전문지식 / 논리적 사고력 문제해결능력 / 의사소통 협업능력 / 분석력

한 장에 여백이 없도록 작성

서식 일치 (미리보기 또는 인쇄 활용)

이직할 느낌 주지않기 + 회사에 어떻게 보탬이 될 것인지

 

이메일 지원서

~~ 입니다
공고를보고~~지원

지원서류설명

문제시 연락처

- ~~ 드림

 

잡사이트

사람인 - 첨부가 까다롭다 - 이력서관리 - 수정할 부분을 선택 - 대회활동(학원훈련), 보유기술 - 취업우대사항 - 추천인재 공개 - 보유기술 - 포트폴리오 - 동시 적용 - 나의 프로필에는 적지 않는 것이 좋음

워크넷 - 마이페이지 - 이력서 등록 - 훈련자격중심형, 경력 중심형 - 시키는대로 - 맟춤채용정보 저장

잡코리아 - 

인크루트 - 

알바몬 알바천국 로켓펀치 - 취업어려울시 계약직 

 

면접

직무지식을 잘배웠는가
성격이 좋은가
어떤 회사인가
이력서 자기소개서 내용
진로를 변경한 이유
교육 받으면서 잘했던 분야, 힘들었던 분야
부득이하게 면접 못 갈 경우 연락

피해야할 인재유형 참고
- 팀 내 트러블 메이커
- 나만 아는 이기주의자
- 지각, 결근 밥먹듯 하는 유형
- 실제 역량보다 부풀려진 이력서
- 조직원과 어울리지 못하는 유형

간단명료, 천천히, 또박또박, 차분한 어조
질문을 파악하지 못하였을 경우 겸손히 재질문
난처한 질문 - 긍정적인 내용으로 대처

입실
목례
앉으라고하면 앉기

인중보기

두괄식으로 말하기 + 이유, 3분 이내로 말하기

기분 나쁜 질문도 성의 껏

 

기술소개서

나에게 맞게 수정

 

 

'낙서장' 카테고리의 다른 글

NOSQL (몽고DB)  (0) 2020.08.06
노션  (0) 2020.08.06
라이엇 API 정리  (0) 2020.08.03
git // 깃헙 리파지토리 내용 바꾸기  (0) 2020.08.03
git 깃 // 공동작업 시 merge 머징 CONFLICT 문제 해결법  (0) 2020.07.30

 

서비스 파일 생성

 

 

 

 

 

 

AndroidManifest.xml

위 처럼 ide를 통해 만들면 안드로이드 메니페스트에 자동으로 등록된다

 

 

3개를 추가적으로 생성

 

 

command는 서비스 쪽으로 전달한 인텐트 객체의 데이터가 어떤 목적으로 사용되는지 구별하기 위해 넣은것

 

 

startService()메서드에 담은 인텐트 객체는 MyService 클래스의 onStartCommand()메서드로 전달됨

 

 

확인해보면 데이터가 출력됨

 

 

 

MyService

화면이 없는 service에서 화면이 있는 액티비티를 띄우려면 새로운 태스크를 만들어야한다

MainActivity객체가 이미 메모리에 만들어져 있을 때 재사용하도록 

intent.FLAG_ACTIVITY_SINGLE_TOP | intent.FLAG_ACTIVITY_CLEAR_TOP 를 플래그에 추가

 

 

MainActivity

 

 

5초뒤 서비스에서 전달된 인텐트를 메인 액티비티에서 받아서 처리

 

----------

 

Room을 이용한 연락처 앱 만들기

 

새프로젝트 생성

 

복붙

https://github.com/codingspecialist/Android-ContactApp-Room-v1

 

codingspecialist/Android-ContactApp-Room-v1

Contribute to codingspecialist/Android-ContactApp-Room-v1 development by creating an account on GitHub.

github.com

 

 

액션바 바꾸기

onCreateOptionsMenu 액션바에 메뉴 넣기

 

 

 

 

 

 

 

 

 

 

 

 

 

 

---

메인액티비티 수정

https://ondolroom.tistory.com/664

 

안드로이드 // MainActivity 구성방식

package com.jaybon.contactsapp; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.re..

ondolroom.tistory.com

---

 

편지버튼 누르면 창 뜨고 인서트

 

 

 

-----------

 

전체삭제

 

 

 

 

 

 

---------

프로그래밍의 목적은 데이터베이스의 내용과 동기화 하는 것을 따라감

// DB내용변경 -> 어댑터 데이터 변경 -> UI 갱신
// MVVM의 경우 DB내용변경 -> 어댑터 데이터 변경시 UI 자동갱신
// 리액티브 프로그래밍의 경우 DB내용변경시 어댑터 데이터 자동갱신 +UI 자동갱신

--------

 

클릭시 상세보기

연락처 개별삭제

 

 

 

----------

연락처 수정하기

 

생성자 오버로딩 추가

@Ignore 를 추가하여 Room 데이터베이스에 적용되지 않도록 함

(id는 오토인크리먼트를 사용할 것이므로)

 

리스너를 달아줌

 

 

----------------

 

https://github.com/codingspecialist/Android-ContactApp-Room-ImageUpload-v2

 

codingspecialist/Android-ContactApp-Room-ImageUpload-v2

Contribute to codingspecialist/Android-ContactApp-Room-ImageUpload-v2 development by creating an account on GitHub.

github.com

 

고투 앨범 (프로필사진 앨범 또는 카메라 접근 )

 

매니페스트에 아래코드 추가

 

MainActivity 아래 복붙

더보기
    // 앨범으로 이동
    private void goToAlbum() {
        Intent intent = new Intent(Intent.ACTION_PICK);
        intent.setType(MediaStore.Images.Media.CONTENT_TYPE);
        startActivityForResult(intent, PICK_FROM_ALBUM);
    }

    // 이미지 채우기
    private void setImage() {
        BitmapFactory.Options options = new BitmapFactory.Options();
        Bitmap originalBm = BitmapFactory.decodeFile(tempFile.getAbsolutePath(), options);
        ivProfile.setImageBitmap(originalBm);
    }

    // URI로 이미지 실제 경로 가져오기
    private String getRealPathFromURI(Uri contentURI) {
        String result;
        Cursor cursor = getContentResolver().query(contentURI, null, null, null, null);
        if (cursor == null) { // Source is Dropbox or other similar local file path
            result = contentURI.getPath();
        } else {
            cursor.moveToFirst();
            int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
            result = cursor.getString(idx);
            cursor.close();
        }
        return result;
    }

    // 이미지 선택 후 이미지 채우기
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == PICK_FROM_ALBUM) {
            Uri photoUri = data.getData();
            imageRealPath = getRealPathFromURI(photoUri);
            tempFile = new File(imageRealPath);
            setImage();
        }
    }

 

 

 

전역변수에 추가

더보기
    // 사진 업로드
    private CircleImageView ivProfile;
    private File tempFile;
    private String imageRealPath;
    private static final int PICK_FROM_ALBUM = 1;
    private static final int PICK_FROM_CAMERA = 2;

 

Intent는 내장앱이나 다른앱으로도 접근 할 수 있다 (다른앱에서 허용되어있을 경우)

ACTION_PICK

 

결과를 리턴받겠다는 뜻

 

 

사진첩으로 이동한다

 

 

이미지 선택하면 이쪽으로 온다

 

 

 

setImage안되면 변경

 

https://lktprogrammer.tistory.com/188

 

[Android] 안드로이드 - 갤러리에서 이미지 가져오기

1. /res/layout/activity_main.xml ▼ 갤러리에서 가져온 사진을 표현하기 위해 ImageView 위젯 하나를 배치하였습니다. 해당 예제에서는 화면에 배치되어 있는 ImageView..

lktprogrammer.tistory.com

 

-----------

파일 구조변경

ImageUpload

더보기
package com.jaybon.contactsapp.util;

import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.provider.MediaStore;

import com.jaybon.contactsapp.MainActivity;

import de.hdodenhof.circleimageview.CircleImageView;

public class ImageUpload {

    public static final int PICK_FROM_ALBUM = 1;

    // 앨범으로 이동
    public static void goToAlbum(MainActivity mainActivity) {
        Intent intent = new Intent(Intent.ACTION_PICK);
        intent.setType(MediaStore.Images.Media.CONTENT_TYPE);
        mainActivity.startActivityForResult(intent, ImageUpload.PICK_FROM_ALBUM);
    }

    // 이미지 채우기
    public static void setImage(String profileURL, CircleImageView ivProfile) {
        BitmapFactory.Options options = new BitmapFactory.Options();
        Bitmap originalBm = BitmapFactory.decodeFile(profileURL, options);
        ivProfile.setImageBitmap(originalBm);
    }

    // URI로 이미지 실제 경로 가져오기
    public static String getRealPathFromURI(Uri contentURI, MainActivity mainActivity) {
        String result;
        Cursor cursor = mainActivity.getContentResolver().query(contentURI, null, null, null, null);
        if (cursor == null) {
            result = contentURI.getPath();
        } else {
            cursor.moveToFirst();
            int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
            result = cursor.getString(idx);
            cursor.close();
        }
        return result;
    }
}

 

MainActivity

더보기
package com.jaybon.contactsapp;

import android.Manifest;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.room.Room;

import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.gun0912.tedpermission.PermissionListener;
import com.gun0912.tedpermission.TedPermission;
import com.jaybon.contactsapp.adapter.ContactAdapter;
import com.jaybon.contactsapp.db.ContactAppDatabase;
import com.jaybon.contactsapp.db.model.Contact;
import com.jaybon.contactsapp.service.ContactService;
import com.jaybon.contactsapp.util.ImageUpload;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import de.hdodenhof.circleimageview.CircleImageView;

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "Main_Activity";
    private Context mContext = MainActivity.this;

    private Toolbar toolbar;
    private RecyclerView recyclerView;
    private RecyclerView.LayoutManager mLayoutManager;
    private ContactAdapter adapter;
    private FloatingActionButton fab;

    private ContactAppDatabase contactAppDatabase;
    private ContactService contactService;
    private List<Contact> contacts;

    // 사진 업로드
    private CircleImageView ivProfile;
    private File tempFile;
    private String imageRealPath;
    private static final int PICK_FROM_ALBUM = 1;
    private static final int PICK_FROM_CAMERA = 2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // DB관련
        contactAppDatabase = Room.databaseBuilder(getApplicationContext(), ContactAppDatabase.class, "ContactDB")
                .allowMainThreadQueries()
                .fallbackToDestructiveMigration()
                .build();
        contactService = new ContactService(contactAppDatabase.contactRepository());

        initData();
        initObject();
        initDesign();
        initListener();

        tedPermission();
    }

    private void initData(){
        contacts = contactService.연락처전체보기();
    }

    private void initObject(){
        toolbar = findViewById(R.id.toolbar);
        recyclerView = findViewById(R.id.recycler_view_contacts);
        fab = findViewById(R.id.fab);
        ivProfile = findViewById(R.id.iv_profile);
        adapter = new ContactAdapter((MainActivity)mContext , contacts);
    }

    private void initDesign(){
        setSupportActionBar(toolbar);
        getSupportActionBar().setTitle(" Contact App");

        mLayoutManager = new LinearLayoutManager(getApplicationContext());
        recyclerView.setLayoutManager(mLayoutManager);
        recyclerView.setAdapter(adapter);
    }

    private void initListener(){
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                addContactDialog();
            }
        });
    }

    public void addContactDialog(){
        View dialogView = LayoutInflater.from(getApplicationContext()).inflate(R.layout.layout_add_contact, null);
        final EditText etName = dialogView.findViewById(R.id.name);
        final EditText etEmail = dialogView.findViewById(R.id.email);

        // 갤러리 사진 가져오기
        ivProfile = dialogView.findViewById(R.id.iv_profile);
        ivProfile.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ImageUpload.goToAlbum((MainActivity) mContext);
            }
        });

        AlertDialog.Builder dlg = new AlertDialog.Builder(MainActivity.this);
        dlg.setTitle("연락처 등록");
        dlg.setView(dialogView);
        dlg.setPositiveButton("등록", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                createContact(etName.getText().toString(), etEmail.getText().toString());
            }
        });
        dlg.setNegativeButton("닫기", null);
        dlg.show();
    }

    public void editContactDialog(final Contact contact){
        View dialogView = LayoutInflater.from(getApplicationContext()).inflate(R.layout.layout_add_contact, null);
        final EditText etName = dialogView.findViewById(R.id.name);
        final EditText etEmail = dialogView.findViewById(R.id.email);

        // 갤러리 사진 수정하기
        ivProfile = dialogView.findViewById(R.id.iv_profile);
        ivProfile.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //goToAlbum();
            }
        });

        etName.setText(contact.getName());
        etEmail.setText(contact.getEmail());

        AlertDialog.Builder dlg = new AlertDialog.Builder(MainActivity.this);
        dlg.setTitle("연락처 수정");
        dlg.setView(dialogView);
        dlg.setPositiveButton("수정", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
//                createContact(etName.getText().toString(), etEmail.getText().toString());
                Contact updateContact = new Contact(contact.getId(), etName.getText().toString(), etEmail.getText().toString());

                contactService.연락처수정(updateContact);
                notifyListener();

            }
        });
        dlg.setNegativeButton("삭제", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                contactService.연락처삭제(contact.getId());
                notifyListener();
            }
        });
        dlg.show();
    }

    private void createContact(String name, String email) {
        long contactId = contactService.연락처등록(new Contact(name, email));
        Contact contact = contactService.연락처상세보기(contactId);
        adapter.addItem(contact);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {

//        long menuId = item.getItemId(); // 개별 연락처의 번호

        contactService.연락처전체삭제();
        Log.d(TAG, "onOptionsItemSelected: 삭제됨");

        notifyListener();

        return true;
    }

    public void notifyListener(){
        // DB내용변경 -> 어댑터 데이터 변경 -> UI 갱신
        // MVVM의 경우 DB내용변경 -> 어댑터 데이터 변경시 UI 자동갱신
        // 리액티브 프로그래밍의 경우 DB내용변경시 어댑터 데이터 자동갱신 +UI 자동갱신
        adapter.addItems(contactService.연락처전체보기()); // adapter 내용변경
        adapter.notifyDataSetChanged(); // ui 갱신
    }

//    // 앨범으로 이동
//    private void goToAlbum() {
//        Intent intent = new Intent(Intent.ACTION_PICK);
//        intent.setType(MediaStore.Images.Media.CONTENT_TYPE);
//        startActivityForResult(intent, PICK_FROM_ALBUM);
//    }
//
//    // 이미지 채우기
//    public void setImage() {
//        BitmapFactory.Options options = new BitmapFactory.Options();
//        Bitmap originalBm = BitmapFactory.decodeFile(tempFile.getAbsolutePath(), options);
//        ivProfile.setImageBitmap(originalBm);
//    }
//
//    // URI로 이미지 실제 경로 가져오기
//    private String getRealPathFromURI(Uri contentURI) {
//        String result;
//        Cursor cursor = getContentResolver().query(contentURI, null, null, null, null);
//        if (cursor == null) { // Source is Dropbox or other similar local file path
//            result = contentURI.getPath();
//        } else {
//            cursor.moveToFirst();
//            int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
//            result = cursor.getString(idx);
//            cursor.close();
//        }
//        return result;
//    }

    // 이미지 선택 후 이미지 채우기
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        Log.d(TAG, "onActivityResult: 사진 선택 후 여기");
        
        if (requestCode == PICK_FROM_ALBUM) { // 앨범에서 가져온 데이터
            Uri photoUri = data.getData();

            imageRealPath = ImageUpload.getRealPathFromURI(photoUri, (MainActivity) mContext);

            Log.d(TAG, "onActivityResult: imageRealPath" + imageRealPath);

            tempFile = new File(imageRealPath);
            ImageUpload.setImage(tempFile.getAbsolutePath(), ivProfile);

        } else if(requestCode == PICK_FROM_CAMERA) {
            // 카메라로 찍은 데이터
        }
    }

    // ------------- 아래는 사진 업로드를 위한 추가 코드 ---------------------
    // https://dd00oo.tistory.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EA%B0%A4%EB%9F%AC%EB%A6%AC%EC%9D%98-%EC%8B%A4%EC%A0%9C%EA%B2%BD%EB%A1%9C-%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0

    // 권한 관련
    private void tedPermission() {
        PermissionListener permissionListener = new PermissionListener() {
            @Override
            public void onPermissionGranted() {
                // 권한 요청 성공
            }

            @Override
            public void onPermissionDenied(ArrayList<String> deniedPermissions) {
                // 권한 요청 실패
            }
        };

        TedPermission.with(this)
                .setPermissionListener(permissionListener)
                .setRationaleMessage(getResources().getString(R.string.permission_2))
                .setDeniedMessage(getResources().getString(R.string.permission_1))
                .setPermissions(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA)
                .check();

    }
}

 

----

 

https://github.com/codingspecialist/Android-Room-Service-ImageUpload-V3

 

codingspecialist/Android-Room-Service-ImageUpload-V3

Contribute to codingspecialist/Android-Room-Service-ImageUpload-V3 development by creating an account on GitHub.

github.com

 

 

 

 

 

 

 

 

 

OAuth + 일반로그인

https://ondolroom.tistory.com/646

 

spring boot // 머스태치 mustache html / 주소 일부허용, 컨트롤러에서 허용 / 이클립스 내에서 의존성 ��

-------------- jpa 메서드 참고 https://github.com/codingspecialist/Springboot-Security-OAuth2.0-V2 codingspecialist/Springboot-Security-OAuth2.0-V2 Contribute to codingspecialist/Springboot-Security..

ondolroom.tistory.com

 

 

페이스북 OAuth 로그인

https://ondolroom.tistory.com/651

 

spring boot // 페이스북 로그인

------------------- 테스트결과 잘들어감

ondolroom.tistory.com

 

 

네이버 OAuth 로그인 참고 사이트

https://for1123.tistory.com/24

 

19. 네아로(네이버 아이디로 로그인) API 사용하기

네이버 개발자 센터로 들어가 Application 탭에서 애플리케이션 등록을 누르면 다음과 같은 화면이 나타납니다. 위와 같이 설정하고 등록하면 Client ID와 Secret을 획득할 수 있습니다. 네이버에서는 �

for1123.tistory.com

 

 

참고

구글, 페이스북은 키 - 밸류 형태

네이버는 제이슨 형식이다

 

 

application.yml

기본프로바이더에 네이버가없기 때문에 프로바이더를 추가해준다

 

 

NaverUserInfo.java

기존 OAuth2UserInfo 커스텀과 다르게 attributes안에서 response를 가져와야한다

가져오는 함수를 하나 만들어서 리턴한다

 

 

PrincipalOauth2UserService.java

네이버를 추가해준다

---

 

 

테스트

---

 

 

DB

정상적으로 입력됨

 

----------

 

코드

 

application.yml

더보기
server:
  port: 8080
  servlet:
    context-path: /
    encoding:
      charset: utf-8
      enabled: true
      force: true
      
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/security?serverTimezone=Asia/Seoul
    username: cos
    password: cos1234
    
#  mvc:
#    view:
#      prefix: /templates/
#      suffix: .mustache


  jpa:
    hibernate:
      ddl-auto: update #create update none 3개 중 하나 선택 , 개발이 끝나면 none
      naming:
        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
    show-sql: true
      
      
  security:
    oauth2:
      client:
        registration:
          google: # /oauth2/authorization/google가 이 주소를 동작하게 한다
            client-id: 키
            client-secret: 키
            scope:
            - email
            - profile #스코프는 회사마다 다르기 때문에 적음
          
          facebook:
            client-id: 키
            client-secret: 키
            scope:
            - email
            - public_profile
          
          naver:
            client-id: 키
            client-secret: 키
            redirect-uri: http://localhost:8080/login/oauth2/code/naver
            authorization-grant-type: authorization_code
            scope:
            - email
            - profile_image
            
        provider:
          naver: 
            authorization-uri: https://nid.naver.com/oauth2.0/authorize
            token-uri: https://nid.naver.com/oauth2.0/token
            user-info-uri: https://openapi.naver.com/v1/nid/me
            user-name-attribute: response

 

 

SecurityConfig.java

더보기
package com.jaybon.securityEx01.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.authentication.UserServiceBeanDefinitionParser;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.oauth2.client.userinfo.OAuth2UserService;
import org.springframework.security.oauth2.core.user.OAuth2User;

import com.jaybon.securityEx01.config.oauth.PrincipalOauth2UserService;

@Configuration // IoC 빈(bean, 인스턴스)을 등록
@EnableWebSecurity // 필터 체인 관리 시작 어노테이션
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) // 컨트롤러 접근 전에 낚아챔, 특정 주소 접근시 권한 및 인증 미리체크
public class SecurityConfig extends WebSecurityConfigurerAdapter{
	
	@Autowired
	private PrincipalOauth2UserService principalOauth2UserService;
	
	@Bean // IoC에 등록되어 컨피그가 호출될 때 생성, 메서드를 IoC하는 방법
	public BCryptPasswordEncoder enc() { // 마땅히 둘 곳이 없어서 둔 것 Controller를 제외한 곳에 둠
		return new BCryptPasswordEncoder();
	}
	
	@Override
	public void configure(WebSecurity web) throws Exception {
		web.ignoring().antMatchers("/admin/1");
	}
	
	@Override
	protected void configure(HttpSecurity http) throws Exception {
		
		http.csrf().disable(); // csrf 비활성화
		
		http.authorizeRequests()
			.antMatchers("/user/**").authenticated()// authenticated() 인증
//			.antMatchers("/admin/**").access("hasRole('ROLE_ADMIN') or hasRole('ROLE_USER')") // access() 권한 .hasAnyRole()
//			.antMatchers("/admin/**").access("hasRole('ROLE_ADMIN') and hasRole('ROLE_USER')")
			.antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
			.anyRequest().permitAll()
		.and()
			.formLogin()
			.loginPage("/login") // 인증이 필요한 곳에 /login 으로 리다이렉트
			.loginProcessingUrl("/loginProc") // 필터체인에서 인지하고 있다가 시큐리티가 낚아채서 Authentication Manager
			.defaultSuccessUrl("/") // 성공하면 해당 주소로 이동 / 슬래시만 달면 이전 주소로 이동
		.and()
			.oauth2Login()
			.loginPage("/login")
			.userInfoEndpoint()
			.userService(principalOauth2UserService);
	}
}

 

 

NaverUserInfo.java

더보기
package com.jaybon.securityEx01.config.oauth.provider;

import java.util.Map;


public class NaverUserInfo implements OAuth2UserInfo{
	
    private Map<String, Object> attributes;

	public NaverUserInfo(Map<String, Object> attrubutes) {
		this.attributes = attrubutes;
	}
	
    private Map<String, Object> ofNaver(Map<String, Object> attributes) {
        Map<String, Object> response = (Map<String, Object>) attributes.get("response");

        return response;
    }

	@Override
	public String getProviderId() {
		return (String) ofNaver(attributes).get("id");
	}

	@Override
	public String getProvider() {
		return "naver";
	}

	@Override
	public String getEmail() {
		return (String) ofNaver(attributes).get("email");
	}

	@Override
	public String getName() {
		return (String) ofNaver(attributes).get("name");
	}
}

 

 

PrincipalOauth2UserService.java

더보기
package com.jaybon.securityEx01.config.oauth;

import java.util.Optional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.oauth2.client.userinfo.DefaultOAuth2UserService;
import org.springframework.security.oauth2.client.userinfo.OAuth2UserRequest;
import org.springframework.security.oauth2.core.OAuth2AuthenticationException;
import org.springframework.security.oauth2.core.user.OAuth2User;
import org.springframework.stereotype.Service;

import com.jaybon.securityEx01.config.auth.PrincipalDetails;
import com.jaybon.securityEx01.config.oauth.provider.FacebookUserInfo;
import com.jaybon.securityEx01.config.oauth.provider.GoogleUserInfo;
import com.jaybon.securityEx01.config.oauth.provider.NaverUserInfo;
import com.jaybon.securityEx01.config.oauth.provider.OAuth2UserInfo;
import com.jaybon.securityEx01.model.User;
import com.jaybon.securityEx01.repository.UserRepository;

@Service
public class PrincipalOauth2UserService extends DefaultOAuth2UserService{
	
	@Autowired
	private UserRepository userRepository;
	
	@Override
	public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException {
	
		
		OAuth2User oAuth2User = super.loadUser(userRequest); // 토큰값으로 자원을 받아오는 함수
		
		// 1번: oAuth2User의 정보를 principalDetails에 넣어주면 된다.
		// 2번: PrincipalDetails를 리턴한다.
		System.out.println("userRequest"+userRequest.getAccessToken().getTokenValue()); // 코드 토큰 유저정보
		System.out.println("userRequest"+userRequest.getClientRegistration()); // 코드 토큰 유저정보
		System.out.println(oAuth2User); // 토큰을 통해 응답받은 회원정보
		
		try {
			
		} catch (Exception e) {
			// TODO: handle exception
		}
				
		return processOAuth2User(userRequest, oAuth2User); // 이때 세션에 등록된다 OAuth2User
	}
	
	private OAuth2User processOAuth2User(OAuth2UserRequest userRequest, OAuth2User oAuth2User) {
		
		// 일반적으로는 로그인할 때 유저정보 User
		// 1번 : OAuth2로 로그인할 때 유저정보 oAuth2User.getAttributes() <- 구성해야됨
		// 2번 : DB에 이 사람있나?
		// 있으면? -> 업데이트(구글에서 바뀐정보가 있을 수 있으니 확인 없이 무조건 업데이트)
		// 없으면? -> 인서트(회원가입)
		// 리턴을 PrincipalDetails를 리턴
		
		OAuth2UserInfo oAuth2UserInfo = null;
		if(userRequest.getClientRegistration().getRegistrationId().equals("google")) {
			oAuth2UserInfo = new GoogleUserInfo(oAuth2User.getAttributes());
		} else if(userRequest.getClientRegistration().getRegistrationId().equals("facebook")) {
			oAuth2UserInfo = new FacebookUserInfo(oAuth2User.getAttributes());
		} else if(userRequest.getClientRegistration().getRegistrationId().equals("naver")) {
			oAuth2UserInfo = new NaverUserInfo(oAuth2User.getAttributes());
		} else {
			System.out.println("구글, 페이스북, 네이버만 가능");
		}
		

		Optional<User> userOptional 
			= userRepository.findByProviderAndProviderId(oAuth2UserInfo.getProvider(), oAuth2UserInfo.getProviderId());
		
		User user;
		if(userOptional.isPresent()) {
			user = userOptional.get();
			// 아이디가 있어도 update 해줘야 함
		} else {
			user = User.builder()
					.username(oAuth2UserInfo.getProvider()+"_"+oAuth2UserInfo.getProviderId())
					.email(oAuth2UserInfo.getEmail())
					.role("ROLE_USER")
					.provider(oAuth2UserInfo.getProvider())
					.providerId(oAuth2UserInfo.getProviderId())
					.build();
			userRepository.save(user);
		}
			
		return new PrincipalDetails(user, oAuth2User.getAttributes());
	}
}

 

 

 

 

 

 

 

 

 

 

 

 

 

-------------------

 

 

 

 

 

 

테스트결과 잘들어감

 

 

 

 

 

 

 

유저 닉네임으로 유저정보 가져오기 (필수값 : 유저닉네임)

https://kr.api.riotgames.com/lol/summoner/v4/summoners/by-name/hide on bush?api_key=RGAPI-ae7e7903-6888-4416-953a-916b38d1e004

-

더보기
{
"id":"AVrX6592MexG63ACYtwUrXGKUupB67nzpIkA4Erb9LCtyw",
"accountId":"KeU7EWsN4M_49nHyece2ErlHksjMr4mjjP1jD_A8czKL",
"puuid":"qzcLHst_fFUhcvB37SQjmx5JGKKOBchtroC83qVKiYgnnjLvBHntg3WJJfYNsRRDT5IeeCg9lmMVpQ",
"name":"Hide on bush",
"profileIconId":6,
"revisionDate":1595655154000,
"summonerLevel":334
}

-

 

 

암호화된 AccountId로 유저정보 가져오기 (필수값 : 암호화된 AccountId)

https://kr.api.riotgames.com/lol/summoner/v4/summoners/by-account/KeU7EWsN4M_49nHyece2ErlHksjMr4mjjP1jD_A8czKL?api_key=RGAPI-ae7e7903-6888-4416-953a-916b38d1e004

-

더보기
{
    "id": "AVrX6592MexG63ACYtwUrXGKUupB67nzpIkA4Erb9LCtyw",
    "accountId": "KeU7EWsN4M_49nHyece2ErlHksjMr4mjjP1jD_A8czKL",
    "puuid": "qzcLHst_fFUhcvB37SQjmx5JGKKOBchtroC83qVKiYgnnjLvBHntg3WJJfYNsRRDT5IeeCg9lmMVpQ",
    "name": "Hide on bush",
    "profileIconId": 6,
    "revisionDate": 1595655154000,
    "summonerLevel": 334
}

-

 

 

암호화된 PUUID로 유저정보 가져오기 (필수값 : 암호화된 PUUID)

https://kr.api.riotgames.com/lol/summoner/v4/summoners/by-puuid/qzcLHst_fFUhcvB37SQjmx5JGKKOBchtroC83qVKiYgnnjLvBHntg3WJJfYNsRRDT5IeeCg9lmMVpQ?api_key=RGAPI-ae7e7903-6888-4416-953a-916b38d1e004

-

더보기
{
    "id": "AVrX6592MexG63ACYtwUrXGKUupB67nzpIkA4Erb9LCtyw",
    "accountId": "KeU7EWsN4M_49nHyece2ErlHksjMr4mjjP1jD_A8czKL",
    "puuid": "qzcLHst_fFUhcvB37SQjmx5JGKKOBchtroC83qVKiYgnnjLvBHntg3WJJfYNsRRDT5IeeCg9lmMVpQ",
    "name": "Hide on bush",
    "profileIconId": 6,
    "revisionDate": 1595655154000,
    "summonerLevel": 334
}

-

 

 

주어진 소환사 ID에 대해 모든 대기열에서 리그 항목 가져 오기(필수값 : 유저암호화 프라이머리키)

https://kr.api.riotgames.com/lol/league/v4/entries/by-summoner/AVrX6592MexG63ACYtwUrXGKUupB67nzpIkA4Erb9LCtyw?api_key=RGAPI-ae7e7903-6888-4416-953a-916b38d1e004

-

더보기
[
    {
        "leagueId": "5cc4fe58-4e57-37f1-9dc3-7c32b2632923",
        "queueType": "RANKED_SOLO_5x5",
        "tier": "CHALLENGER",
        "rank": "I",
        "summonerId": "AVrX6592MexG63ACYtwUrXGKUupB67nzpIkA4Erb9LCtyw",
        "summonerName": "Hide on bush",
        "leaguePoints": 870,
        "wins": 394,
        "losses": 354,
        "veteran": true,
        "inactive": false,
        "freshBlood": false,
        "hotStreak": false
    }
]

-

 

주어진 소환사 ID에 대해 모든 대기열에서 리그 항목 가져 오기(필수값 : 유저암호화 프라이머리키) - 리그 2개

https://kr.api.riotgames.com/lol/league/v4/entries/by-summoner/JYSV4fa8ieeedl1LKjHaEv5XX--85Kxq8OFVzuU4fFSVN1c?api_key=RGAPI-ee173b8c-c050-41af-8d73-ad267aa59531

 

-

더보기
[
    {
        "leagueId": "f670c387-acba-458d-a835-f40a5a6b49cd",
        "queueType": "RANKED_FLEX_SR",
        "tier": "SILVER",
        "rank": "III",
        "summonerId": "JYSV4fa8ieeedl1LKjHaEv5XX--85Kxq8OFVzuU4fFSVN1c",
        "summonerName": "퍼플팀 죠앤",
        "leaguePoints": 62,
        "wins": 8,
        "losses": 2,
        "veteran": false,
        "inactive": false,
        "freshBlood": false,
        "hotStreak": true
    },
    {
        "leagueId": "5cc4fe58-4e57-37f1-9dc3-7c32b2632923",
        "queueType": "RANKED_SOLO_5x5",
        "tier": "CHALLENGER",
        "rank": "I",
        "summonerId": "JYSV4fa8ieeedl1LKjHaEv5XX--85Kxq8OFVzuU4fFSVN1c",
        "summonerName": "퍼플팀 죠앤",
        "leaguePoints": 876,
        "wins": 158,
        "losses": 99,
        "veteran": false,
        "inactive": false,
        "freshBlood": false,
        "hotStreak": false
    }
]

-

 

내림차순으로 챔피언 포인트 수를 기준으로 정렬 된 모든 챔피언 마스터리 항목을 가져옵니다 (필수값 : 유저암호화 프라이머리키)

https://kr.api.riotgames.com/lol/champion-mastery/v4/champion-masteries/by-summoner/AVrX6592MexG63ACYtwUrXGKUupB67nzpIkA4Erb9LCtyw?api_key=RGAPI-ae7e7903-6888-4416-953a-916b38d1e004

-

더보기
[
    {
        "championId": 7,
        "챔피언 레벨": 7,
        "championPoints": 425502,
        "lastPlayTime": 1596428855000,
        "championPointsSinceLastLevel": 403902,
        "championPointsUntilNextLevel": 0,
        "chestGranted": true,
        "tokensEarned": 0,
        "summonerId": "AVrX6592MexG63ACYtwUrXGKUupB67nzpIkA4Erb9LCtyw"
    },
    {
        "championId": 268,
        "챔피언 레벨": 7,
        "championPoints": 225792,
        "lastPlayTime": 1595956798000,
        "championPointsSinceLastLevel": 204192,
        "championPointsUntilNextLevel": 0,
        "chestGranted": true,
        "tokensEarned": 0,
        "summonerId": "AVrX6592MexG63ACYtwUrXGKUupB67nzpIkA4Erb9LCtyw"
    },
    {
        "championId": 157,
        "챔피언 레벨": 7,
        "championPoints": 183080,
        "lastPlayTime": 1594052584000,
        "championPointsSinceLastLevel": 161480,
        "championPointsUntilNextLevel": 0,
        "chestGranted": true,
        "tokensEarned": 0,
        "summonerId": "AVrX6592MexG63ACYtwUrXGKUupB67nzpIkA4Erb9LCtyw"
    }
]

-

 

 

플레이어의 총 챔피언 마스터리 점수를 얻으십시오. 이는 개별 챔피언 마스터리 레벨의 합계입니다 (필수값 : 유저암호화 프라이머리키)

https://kr.api.riotgames.com/lol/champion-mastery/v4/scores/by-summoner/AVrX6592MexG63ACYtwUrXGKUupB67nzpIkA4Erb9LCtyw?api_key=RGAPI-ae7e7903-6888-4416-953a-916b38d1e004

-

587

-

 

 

챔프 로테이션

https://kr.api.riotgames.com/lol/platform/v3/champion-rotations?api_key=RGAPI-ae7e7903-6888-4416-953a-916b38d1e004

-

더보기
{
    "freeChampionIds": [
        25,
        60,
        67,
        83,
        84,
        90,
        106,
        107,
        114,
        117,
        134,
        157,
        222,
        254,
        516
    ],
    "freeChampionIdsForNewPlayers": [
        18,
        81,
        92,
        141,
        37,
        238,
        19,
        45,
        25,
        64
    ],
    "maxNewPlayerLevel": 10
}

-

 

 

 

암호화된 AccountId로 게임의 일치 목록을 가져옵니다 (있는 경우) (필수값 : 암호화된 AccountId)

https://kr.api.riotgames.com/lol/match/v4/matchlists/by-account/KeU7EWsN4M_49nHyece2ErlHksjMr4mjjP1jD_A8czKL?api_key=RGAPI-ae7e7903-6888-4416-953a-916b38d1e004

-

더보기
{
    "matches": [
        {
            "platformId": "KR",
            "gameId": 4550089614,
            "champion": 517,
            "queue": 420,
            "season": 13,
            "timestamp": 1596438146482,
            "role": "NONE",
            "lane": "JUNGLE"
        },
        {
            "platformId": "KR",
            "gameId": 4550065763,
            "champion": 517,
            "queue": 420,
            "season": 13,
            "timestamp": 1596436321650,
            "role": "DUO_SUPPORT",
            "lane": "NONE"
        },
        {
            "platformId": "KR",
            "gameId": 4550009585,
            "champion": 81,
            "queue": 420,
            "season": 13,
            "timestamp": 1596434166503,
            "role": "DUO_CARRY",
            "lane": "BOTTOM"
        }
    ],
    "startIndex": 0,
    "endIndex": 100,
    "totalGames": 119
}

-

 

 

암호화된 유저 프라이머리 키로 현재 플레이중인 경기 가져오기 (필수값 : 암호화된 유저 프라이머리)

https://kr.api.riotgames.com/lol/spectator/v4/active-games/by-summoner/AVrX6592MexG63ACYtwUrXGKUupB67nzpIkA4Erb9LCtyw?api_key=RGAPI-ae7e7903-6888-4416-953a-916b38d1e004

-

더보기
{
    "status": {
        "message": "Data not found",
        "status_code": 404
    }
}

-

 

Get match by match ID 매치 아이디로 경기 가져오기 (필수값 : 매치아이디)

https://kr.api.riotgames.com/lol/match/v4/matches/4561055619?api_key=RGAPI-ee173b8c-c050-41af-8d73-ad267aa59531
더보기
{
    "gameId": 4550089614,
    "platformId": "KR",
    "gameCreation": 1596438146482,
    "gameDuration": 1364,
    "queueId": 420,
    "mapId": 11,
    "seasonId": 13,
    "gameVersion": "10.15.330.344",
    "gameMode": "CLASSIC",
    "gameType": "MATCHED_GAME",
    "teams": [
        {
            "teamId": 100,
            "win": "Win",
            "firstBlood": true,
            "firstTower": true,
            "firstInhibitor": true,
            "firstBaron": false,
            "firstDragon": true,
            "firstRiftHerald": true,
            "towerKills": 9,
            "inhibitorKills": 1,
            "baronKills": 0,
            "dragonKills": 2,
            "vilemawKills": 0,
            "riftHeraldKills": 1,
            "dominionVictoryScore": 0,
            "bans": [
                {
                    "championId": -1,
                    "pickTurn": 1
                },
                {
                    "championId": 164,
                    "pickTurn": 2
                },
                {
                    "championId": -1,
                    "pickTurn": 3
                },
                {
                    "championId": 51,
                    "pickTurn": 4
                },
                {
                    "championId": 104,
                    "pickTurn": 5
                }
            ]
        },
        {
            "teamId": 200,
            "win": "Fail",
            "firstBlood": false,
            "firstTower": false,
            "firstInhibitor": false,
            "firstBaron": false,
            "firstDragon": false,
            "firstRiftHerald": false,
            "towerKills": 3,
            "inhibitorKills": 0,
            "baronKills": 0,
            "dragonKills": 0,
            "vilemawKills": 0,
            "riftHeraldKills": 0,
            "dominionVictoryScore": 0,
            "bans": [
                {
                    "championId": 876,
                    "pickTurn": 6
                },
                {
                    "championId": 875,
                    "pickTurn": 7
                },
                {
                    "championId": 20,
                    "pickTurn": 8
                },
                {
                    "championId": -1,
                    "pickTurn": 9
                },
                {
                    "championId": 4,
                    "pickTurn": 10
                }
            ]
        }
    ],
    "participants": [
        {
            "participantId": 1,
            "teamId": 100,
            "championId": 202,
            "spell1Id": 7,
            "spell2Id": 4,
            "stats": {
                "participantId": 1,
                "win": true,
                "item0": 2031,
                "item1": 1018,
                "item2": 3009,
                "item3": 3094,
                "item4": 3031,
                "item5": 1036,
                "item6": 3363,
                "kills": 9,
                "deaths": 1,
                "assists": 6,
                "largestKillingSpree": 6,
                "largestMultiKill": 2,
                "killingSprees": 2,
                "longestTimeSpentLiving": 1211,
                "doubleKills": 3,
                "tripleKills": 0,
                "quadraKills": 0,
                "pentaKills": 0,
                "unrealKills": 0,
                "totalDamageDealt": 110742,
                "magicDamageDealt": 5653,
                "physicalDamageDealt": 103785,
                "trueDamageDealt": 1304,
                "largestCriticalStrike": 943,
                "totalDamageDealtToChampions": 19482,
                "magicDamageDealtToChampions": 1199,
                "physicalDamageDealtToChampions": 17599,
                "trueDamageDealtToChampions": 684,
                "totalHeal": 2085,
                "totalUnitsHealed": 3,
                "damageSelfMitigated": 3926,
                "damageDealtToObjectives": 6595,
                "damageDealtToTurrets": 4175,
                "visionScore": 25,
                "timeCCingOthers": 16,
                "totalDamageTaken": 10299,
                "magicalDamageTaken": 5597,
                "physicalDamageTaken": 4329,
                "trueDamageTaken": 372,
                "goldEarned": 10882,
                "goldSpent": 8775,
                "turretKills": 0,
                "inhibitorKills": 0,
                "totalMinionsKilled": 184,
                "neutralMinionsKilled": 9,
                "neutralMinionsKilledTeamJungle": 1,
                "neutralMinionsKilledEnemyJungle": 0,
                "totalTimeCrowdControlDealt": 112,
                "champLevel": 13,
                "visionWardsBoughtInGame": 4,
                "sightWardsBoughtInGame": 0,
                "wardsPlaced": 11,
                "wardsKilled": 7,
                "firstBloodKill": false,
                "firstBloodAssist": false,
                "firstTowerKill": false,
                "firstTowerAssist": false,
                "firstInhibitorKill": false,
                "firstInhibitorAssist": false,
                "combatPlayerScore": 0,
                "objectivePlayerScore": 0,
                "totalPlayerScore": 0,
                "totalScoreRank": 0,
                "playerScore0": 0,
                "playerScore1": 0,
                "playerScore2": 0,
                "playerScore3": 0,
                "playerScore4": 0,
                "playerScore5": 0,
                "playerScore6": 0,
                "playerScore7": 0,
                "playerScore8": 0,
                "playerScore9": 0,
                "perk0": 8021,
                "perk0Var1": 1420,
                "perk0Var2": 0,
                "perk0Var3": 0,
                "perk1": 8009,
                "perk1Var1": 2620,
                "perk1Var2": 500,
                "perk1Var3": 0,
                "perk2": 9103,
                "perk2Var1": 20,
                "perk2Var2": 10,
                "perk2Var3": 0,
                "perk3": 8017,
                "perk3Var1": 557,
                "perk3Var2": 0,
                "perk3Var3": 0,
                "perk4": 8233,
                "perk4Var1": 14,
                "perk4Var2": 0,
                "perk4Var3": 0,
                "perk5": 8236,
                "perk5Var1": 14,
                "perk5Var2": 0,
                "perk5Var3": 0,
                "perkPrimaryStyle": 8000,
                "perkSubStyle": 8200,
                "statPerk0": 5008,
                "statPerk1": 5008,
                "statPerk2": 5002
            },
            "timeline": {
                "participantId": 1,
                "creepsPerMinDeltas": {
                    "10-20": 9.8,
                    "0-10": 8.2
                },
                "xpPerMinDeltas": {
                    "10-20": 630.5,
                    "0-10": 367.9
                },
                "goldPerMinDeltas": {
                    "10-20": 620.4000000000001,
                    "0-10": 262.9
                },
                "csDiffPerMinDeltas": {
                    "10-20": 0.44999999999999973,
                    "0-10": 0.10000000000000009
                },
                "xpDiffPerMinDeltas": {
                    "10-20": 256.9,
                    "0-10": 17
                },
                "damageTakenPerMinDeltas": {
                    "10-20": 433.6,
                    "0-10": 289.6
                },
                "damageTakenDiffPerMinDeltas": {
                    "10-20": -114.35000000000002,
                    "0-10": 39.30000000000001
                },
                "role": "DUO_CARRY",
                "lane": "BOTTOM"
            }
        },
        {
            "participantId": 2,
            "teamId": 100,
            "championId": 432,
            "spell1Id": 3,
            "spell2Id": 4,
            "stats": {
                "participantId": 2,
                "win": true,
                "item0": 3158,
                "item1": 2065,
                "item2": 3859,
                "item3": 3222,
                "item4": 0,
                "item5": 0,
                "item6": 3364,
                "kills": 2,
                "deaths": 3,
                "assists": 11,
                "largestKillingSpree": 2,
                "largestMultiKill": 1,
                "killingSprees": 1,
                "longestTimeSpentLiving": 534,
                "doubleKills": 0,
                "tripleKills": 0,
                "quadraKills": 0,
                "pentaKills": 0,
                "unrealKills": 0,
                "totalDamageDealt": 22836,
                "magicDamageDealt": 13752,
                "physicalDamageDealt": 5874,
                "trueDamageDealt": 3209,
                "largestCriticalStrike": 0,
                "totalDamageDealtToChampions": 8112,
                "magicDamageDealtToChampions": 6301,
                "physicalDamageDealtToChampions": 1811,
                "trueDamageDealtToChampions": 0,
                "totalHeal": 2884,
                "totalUnitsHealed": 5,
                "damageSelfMitigated": 8807,
                "damageDealtToObjectives": 2155,
                "damageDealtToTurrets": 1667,
                "visionScore": 64,
                "timeCCingOthers": 26,
                "totalDamageTaken": 11538,
                "magicalDamageTaken": 5078,
                "physicalDamageTaken": 6248,
                "trueDamageTaken": 212,
                "goldEarned": 6437,
                "goldSpent": 6225,
                "turretKills": 2,
                "inhibitorKills": 0,
                "totalMinionsKilled": 36,
                "neutralMinionsKilled": 0,
                "neutralMinionsKilledTeamJungle": 0,
                "neutralMinionsKilledEnemyJungle": 0,
                "totalTimeCrowdControlDealt": 165,
                "champLevel": 12,
                "visionWardsBoughtInGame": 7,
                "sightWardsBoughtInGame": 0,
                "wardsPlaced": 33,
                "wardsKilled": 13,
                "firstBloodKill": false,
                "firstBloodAssist": false,
                "firstTowerKill": false,
                "firstTowerAssist": false,
                "firstInhibitorKill": false,
                "firstInhibitorAssist": true,
                "combatPlayerScore": 0,
                "objectivePlayerScore": 0,
                "totalPlayerScore": 0,
                "totalScoreRank": 0,
                "playerScore0": 0,
                "playerScore1": 0,
                "playerScore2": 0,
                "playerScore3": 0,
                "playerScore4": 0,
                "playerScore5": 0,
                "playerScore6": 0,
                "playerScore7": 0,
                "playerScore8": 0,
                "playerScore9": 0,
                "perk0": 8465,
                "perk0Var1": 1508,
                "perk0Var2": 0,
                "perk0Var3": 0,
                "perk1": 8446,
                "perk1Var1": 1017,
                "perk1Var2": 0,
                "perk1Var3": 0,
                "perk2": 8473,
                "perk2Var1": 687,
                "perk2Var2": 0,
                "perk2Var3": 0,
                "perk3": 8242,
                "perk3Var1": 0,
                "perk3Var2": 0,
                "perk3Var3": 0,
                "perk4": 8136,
                "perk4Var1": 13,
                "perk4Var2": 30,
                "perk4Var3": 0,
                "perk5": 8105,
                "perk5Var1": 16,
                "perk5Var2": 5,
                "perk5Var3": 0,
                "perkPrimaryStyle": 8400,
                "perkSubStyle": 8100,
                "statPerk0": 5007,
                "statPerk1": 5002,
                "statPerk2": 5003
            },
            "timeline": {
                "participantId": 2,
                "creepsPerMinDeltas": {
                    "10-20": 2,
                    "0-10": 1.5
                },
                "xpPerMinDeltas": {
                    "10-20": 520.7,
                    "0-10": 262.3
                },
                "goldPerMinDeltas": {
                    "10-20": 363.5,
                    "0-10": 169
                },
                "csDiffPerMinDeltas": {
                    "10-20": 0.44999999999999973,
                    "0-10": 0.10000000000000009
                },
                "xpDiffPerMinDeltas": {
                    "10-20": 256.9,
                    "0-10": 17
                },
                "damageTakenPerMinDeltas": {
                    "10-20": 657.6,
                    "0-10": 308.2
                },
                "damageTakenDiffPerMinDeltas": {
                    "10-20": -114.35000000000002,
                    "0-10": 39.30000000000001
                },
                "role": "DUO_SUPPORT",
                "lane": "BOTTOM"
            }
        },
        {
            "participantId": 3,
            "teamId": 100,
            "championId": 517,
            "spell1Id": 12,
            "spell2Id": 4,
            "stats": {
                "participantId": 3,
                "win": true,
                "item0": 3030,
                "item1": 3157,
                "item2": 2033,
                "item3": 3111,
                "item4": 3089,
                "item5": 3041,
                "item6": 3340,
                "kills": 13,
                "deaths": 1,
                "assists": 5,
                "largestKillingSpree": 9,
                "largestMultiKill": 4,
                "killingSprees": 2,
                "longestTimeSpentLiving": 740,
                "doubleKills": 1,
                "tripleKills": 1,
                "quadraKills": 1,
                "pentaKills": 0,
                "unrealKills": 0,
                "totalDamageDealt": 131765,
                "magicDamageDealt": 123432,
                "physicalDamageDealt": 5857,
                "trueDamageDealt": 2475,
                "largestCriticalStrike": 0,
                "totalDamageDealtToChampions": 25553,
                "magicDamageDealtToChampions": 25174,
                "physicalDamageDealtToChampions": 379,
                "trueDamageDealtToChampions": 0,
                "totalHeal": 10387,
                "totalUnitsHealed": 1,
                "damageSelfMitigated": 16769,
                "damageDealtToObjectives": 13511,
                "damageDealtToTurrets": 7365,
                "visionScore": 19,
                "timeCCingOthers": 21,
                "totalDamageTaken": 23229,
                "magicalDamageTaken": 5756,
                "physicalDamageTaken": 14035,
                "trueDamageTaken": 3437,
                "goldEarned": 13103,
                "goldSpent": 12450,
                "turretKills": 5,
                "inhibitorKills": 0,
                "totalMinionsKilled": 187,
                "neutralMinionsKilled": 16,
                "neutralMinionsKilledTeamJungle": 8,
                "neutralMinionsKilledEnemyJungle": 4,
                "totalTimeCrowdControlDealt": 334,
                "champLevel": 15,
                "visionWardsBoughtInGame": 2,
                "sightWardsBoughtInGame": 0,
                "wardsPlaced": 9,
                "wardsKilled": 5,
                "firstBloodKill": false,
                "firstBloodAssist": false,
                "firstTowerKill": false,
                "firstTowerAssist": false,
                "firstInhibitorKill": false,
                "firstInhibitorAssist": false,
                "combatPlayerScore": 0,
                "objectivePlayerScore": 0,
                "totalPlayerScore": 0,
                "totalScoreRank": 0,
                "playerScore0": 0,
                "playerScore1": 0,
                "playerScore2": 0,
                "playerScore3": 0,
                "playerScore4": 0,
                "playerScore5": 0,
                "playerScore6": 0,
                "playerScore7": 0,
                "playerScore8": 0,
                "playerScore9": 0,
                "perk0": 8021,
                "perk0Var1": 4555,
                "perk0Var2": 0,
                "perk0Var3": 0,
                "perk1": 8009,
                "perk1Var1": 4522,
                "perk1Var2": 500,
                "perk1Var3": 0,
                "perk2": 9105,
                "perk2Var1": 14,
                "perk2Var2": 0,
                "perk2Var3": 0,
                "perk3": 8014,
                "perk3Var1": 756,
                "perk3Var2": 0,
                "perk3Var3": 0,
                "perk4": 8316,
                "perk4Var1": 4385,
                "perk4Var2": 0,
                "perk4Var3": 0,
                "perk5": 8347,
                "perk5Var1": 0,
                "perk5Var2": 0,
                "perk5Var3": 0,
                "perkPrimaryStyle": 8000,
                "perkSubStyle": 8300,
                "statPerk0": 5008,
                "statPerk1": 5008,
                "statPerk2": 5003
            },
            "timeline": {
                "participantId": 3,
                "creepsPerMinDeltas": {
                    "10-20": 9.600000000000001,
                    "0-10": 7.9
                },
                "xpPerMinDeltas": {
                    "10-20": 711.6,
                    "0-10": 490.70000000000005
                },
                "goldPerMinDeltas": {
                    "10-20": 620.6,
                    "0-10": 364.6
                },
                "damageTakenPerMinDeltas": {
                    "10-20": 908.1,
                    "0-10": 360.6
                },
                "role": "NONE",
                "lane": "JUNGLE"
            }
        },
        {
            "participantId": 4,
            "teamId": 100,
            "championId": 2,
            "spell1Id": 4,
            "spell2Id": 11,
            "stats": {
                "participantId": 4,
                "win": true,
                "item0": 1401,
                "item1": 3109,
                "item2": 3024,
                "item3": 2055,
                "item4": 1029,
                "item5": 2422,
                "item6": 3364,
                "kills": 2,
                "deaths": 6,
                "assists": 6,
                "largestKillingSpree": 0,
                "largestMultiKill": 1,
                "killingSprees": 0,
                "longestTimeSpentLiving": 451,
                "doubleKills": 0,
                "tripleKills": 0,
                "quadraKills": 0,
                "pentaKills": 0,
                "unrealKills": 0,
                "totalDamageDealt": 103482,
                "magicDamageDealt": 20982,
                "physicalDamageDealt": 70368,
                "trueDamageDealt": 12131,
                "largestCriticalStrike": 0,
                "totalDamageDealtToChampions": 6336,
                "magicDamageDealtToChampions": 135,
                "physicalDamageDealtToChampions": 4551,
                "trueDamageDealtToChampions": 1648,
                "totalHeal": 5391,
                "totalUnitsHealed": 1,
                "damageSelfMitigated": 11847,
                "damageDealtToObjectives": 14026,
                "damageDealtToTurrets": 1853,
                "visionScore": 17,
                "timeCCingOthers": 8,
                "totalDamageTaken": 21946,
                "magicalDamageTaken": 7819,
                "physicalDamageTaken": 13316,
                "trueDamageTaken": 810,
                "goldEarned": 7362,
                "goldSpent": 8910,
                "turretKills": 0,
                "inhibitorKills": 0,
                "totalMinionsKilled": 28,
                "neutralMinionsKilled": 82,
                "neutralMinionsKilledTeamJungle": 53,
                "neutralMinionsKilledEnemyJungle": 18,
                "totalTimeCrowdControlDealt": 380,
                "champLevel": 11,
                "visionWardsBoughtInGame": 10,
                "sightWardsBoughtInGame": 0,
                "wardsPlaced": 8,
                "wardsKilled": 2,
                "firstBloodKill": false,
                "firstBloodAssist": false,
                "firstTowerKill": false,
                "firstTowerAssist": false,
                "firstInhibitorKill": false,
                "firstInhibitorAssist": true,
                "combatPlayerScore": 0,
                "objectivePlayerScore": 0,
                "totalPlayerScore": 0,
                "totalScoreRank": 0,
                "playerScore0": 0,
                "playerScore1": 0,
                "playerScore2": 0,
                "playerScore3": 0,
                "playerScore4": 0,
                "playerScore5": 0,
                "playerScore6": 0,
                "playerScore7": 0,
                "playerScore8": 0,
                "playerScore9": 0,
                "perk0": 8010,
                "perk0Var1": 89,
                "perk0Var2": 0,
                "perk0Var3": 0,
                "perk1": 9111,
                "perk1Var1": 326,
                "perk1Var2": 160,
                "perk1Var3": 0,
                "perk2": 9104,
                "perk2Var1": 15,
                "perk2Var2": 30,
                "perk2Var3": 0,
                "perk3": 8299,
                "perk3Var1": 123,
                "perk3Var2": 0,
                "perk3Var3": 0,
                "perk4": 8304,
                "perk4Var1": 9,
                "perk4Var2": 0,
                "perk4Var3": 0,
                "perk5": 8410,
                "perk5Var1": 47,
                "perk5Var2": 0,
                "perk5Var3": 0,
                "perkPrimaryStyle": 8000,
                "perkSubStyle": 8300,
                "statPerk0": 5008,
                "statPerk1": 5008,
                "statPerk2": 5002
            },
            "timeline": {
                "participantId": 4,
                "creepsPerMinDeltas": {
                    "10-20": 0.8999999999999999,
                    "0-10": 0.5
                },
                "xpPerMinDeltas": {
                    "10-20": 377,
                    "0-10": 318.7
                },
                "goldPerMinDeltas": {
                    "10-20": 302.29999999999995,
                    "0-10": 290.5
                },
                "damageTakenPerMinDeltas": {
                    "10-20": 1198.5,
                    "0-10": 793
                },
                "role": "NONE",
                "lane": "JUNGLE"
            }
        },
        {
            "participantId": 5,
            "teamId": 100,
            "championId": 117,
            "spell1Id": 12,
            "spell2Id": 4,
            "stats": {
                "participantId": 5,
                "win": true,
                "item0": 3107,
                "item1": 2033,
                "item2": 0,
                "item3": 3504,
                "item4": 3174,
                "item5": 3009,
                "item6": 3363,
                "kills": 6,
                "deaths": 2,
                "assists": 14,
                "largestKillingSpree": 4,
                "largestMultiKill": 1,
                "killingSprees": 1,
                "longestTimeSpentLiving": 347,
                "doubleKills": 0,
                "tripleKills": 0,
                "quadraKills": 0,
                "pentaKills": 0,
                "unrealKills": 0,
                "totalDamageDealt": 91525,
                "magicDamageDealt": 67705,
                "physicalDamageDealt": 15755,
                "trueDamageDealt": 8065,
                "largestCriticalStrike": 0,
                "totalDamageDealtToChampions": 16892,
                "magicDamageDealtToChampions": 12203,
                "physicalDamageDealtToChampions": 3738,
                "trueDamageDealtToChampions": 950,
                "totalHeal": 4873,
                "totalUnitsHealed": 6,
                "damageSelfMitigated": 8763,
                "damageDealtToObjectives": 8449,
                "damageDealtToTurrets": 2706,
                "visionScore": 14,
                "timeCCingOthers": 29,
                "totalDamageTaken": 13388,
                "magicalDamageTaken": 1951,
                "physicalDamageTaken": 11285,
                "trueDamageTaken": 152,
                "goldEarned": 10289,
                "goldSpent": 8125,
                "turretKills": 1,
                "inhibitorKills": 1,
                "totalMinionsKilled": 143,
                "neutralMinionsKilled": 8,
                "neutralMinionsKilledTeamJungle": 0,
                "neutralMinionsKilledEnemyJungle": 4,
                "totalTimeCrowdControlDealt": 454,
                "champLevel": 14,
                "visionWardsBoughtInGame": 3,
                "sightWardsBoughtInGame": 0,
                "wardsPlaced": 8,
                "wardsKilled": 1,
                "firstBloodKill": true,
                "firstBloodAssist": false,
                "firstTowerKill": false,
                "firstTowerAssist": false,
                "firstInhibitorKill": true,
                "firstInhibitorAssist": false,
                "combatPlayerScore": 0,
                "objectivePlayerScore": 0,
                "totalPlayerScore": 0,
                "totalScoreRank": 0,
                "playerScore0": 0,
                "playerScore1": 0,
                "playerScore2": 0,
                "playerScore3": 0,
                "playerScore4": 0,
                "playerScore5": 0,
                "playerScore6": 0,
                "playerScore7": 0,
                "playerScore8": 0,
                "playerScore9": 0,
                "perk0": 8214,
                "perk0Var1": 984,
                "perk0Var2": 507,
                "perk0Var3": 0,
                "perk1": 8226,
                "perk1Var1": 250,
                "perk1Var2": 681,
                "perk1Var3": 0,
                "perk2": 8210,
                "perk2Var1": 0,
                "perk2Var2": 0,
                "perk2Var3": 0,
                "perk3": 8237,
                "perk3Var1": 431,
                "perk3Var2": 0,
                "perk3Var3": 0,
                "perk4": 8345,
                "perk4Var1": 3,
                "perk4Var2": 0,
                "perk4Var3": 0,
                "perk5": 8352,
                "perk5Var1": 281,
                "perk5Var2": 1484,
                "perk5Var3": 1027,
                "perkPrimaryStyle": 8200,
                "perkSubStyle": 8300,
                "statPerk0": 5005,
                "statPerk1": 5008,
                "statPerk2": 5002
            },
            "timeline": {
                "participantId": 5,
                "creepsPerMinDeltas": {
                    "10-20": 7.8999999999999995,
                    "0-10": 5.8
                },
                "xpPerMinDeltas": {
                    "10-20": 542.7,
                    "0-10": 476.5
                },
                "goldPerMinDeltas": {
                    "10-20": 555.5,
                    "0-10": 299.9
                },
                "csDiffPerMinDeltas": {
                    "10-20": 0.0999999999999992,
                    "0-10": -6.661338147750939e-16
                },
                "xpDiffPerMinDeltas": {
                    "10-20": 5.000000000000028,
                    "0-10": 73.79999999999998
                },
                "damageTakenPerMinDeltas": {
                    "10-20": 722.4,
                    "0-10": 444.29999999999995
                },
                "damageTakenDiffPerMinDeltas": {
                    "10-20": -598,
                    "0-10": -405
                },
                "role": "SOLO",
                "lane": "TOP"
            }
        },
        {
            "participantId": 6,
            "teamId": 200,
            "championId": 58,
            "spell1Id": 12,
            "spell2Id": 4,
            "stats": {
                "participantId": 6,
                "win": false,
                "item0": 3071,
                "item1": 3123,
                "item2": 3077,
                "item3": 3111,
                "item4": 1054,
                "item5": 3134,
                "item6": 3340,
                "kills": 5,
                "deaths": 8,
                "assists": 0,
                "largestKillingSpree": 2,
                "largestMultiKill": 1,
                "killingSprees": 1,
                "longestTimeSpentLiving": 220,
                "doubleKills": 0,
                "tripleKills": 0,
                "quadraKills": 0,
                "pentaKills": 0,
                "unrealKills": 0,
                "totalDamageDealt": 92247,
                "magicDamageDealt": 752,
                "physicalDamageDealt": 91243,
                "trueDamageDealt": 252,
                "largestCriticalStrike": 0,
                "totalDamageDealtToChampions": 10786,
                "magicDamageDealtToChampions": 752,
                "physicalDamageDealtToChampions": 9781,
                "trueDamageDealtToChampions": 252,
                "totalHeal": 3307,
                "totalUnitsHealed": 1,
                "damageSelfMitigated": 17427,
                "damageDealtToObjectives": 3395,
                "damageDealtToTurrets": 2835,
                "visionScore": 17,
                "timeCCingOthers": 11,
                "totalDamageTaken": 27195,
                "magicalDamageTaken": 16010,
                "physicalDamageTaken": 10335,
                "trueDamageTaken": 849,
                "goldEarned": 8486,
                "goldSpent": 7975,
                "turretKills": 0,
                "inhibitorKills": 0,
                "totalMinionsKilled": 150,
                "neutralMinionsKilled": 4,
                "neutralMinionsKilledTeamJungle": 0,
                "neutralMinionsKilledEnemyJungle": 4,
                "totalTimeCrowdControlDealt": 35,
                "champLevel": 13,
                "visionWardsBoughtInGame": 0,
                "sightWardsBoughtInGame": 0,
                "wardsPlaced": 6,
                "wardsKilled": 5,
                "firstBloodKill": false,
                "firstBloodAssist": false,
                "firstTowerKill": false,
                "firstTowerAssist": false,
                "firstInhibitorKill": false,
                "firstInhibitorAssist": false,
                "combatPlayerScore": 0,
                "objectivePlayerScore": 0,
                "totalPlayerScore": 0,
                "totalScoreRank": 0,
                "playerScore0": 0,
                "playerScore1": 0,
                "playerScore2": 0,
                "playerScore3": 0,
                "playerScore4": 0,
                "playerScore5": 0,
                "playerScore6": 0,
                "playerScore7": 0,
                "playerScore8": 0,
                "playerScore9": 0,
                "perk0": 8005,
                "perk0Var1": 1108,
                "perk0Var2": 688,
                "perk0Var3": 419,
                "perk1": 9111,
                "perk1Var1": 341,
                "perk1Var2": 100,
                "perk1Var3": 0,
                "perk2": 9104,
                "perk2Var1": 18,
                "perk2Var2": 30,
                "perk2Var3": 0,
                "perk3": 8299,
                "perk3Var1": 524,
                "perk3Var2": 0,
                "perk3Var3": 0,
                "perk4": 8453,
                "perk4Var1": 391,
                "perk4Var2": 6,
                "perk4Var3": 0,
                "perk5": 8444,
                "perk5Var1": 1151,
                "perk5Var2": 0,
                "perk5Var3": 0,
                "perkPrimaryStyle": 8000,
                "perkSubStyle": 8400,
                "statPerk0": 5008,
                "statPerk1": 5008,
                "statPerk2": 5003
            },
            "timeline": {
                "participantId": 6,
                "creepsPerMinDeltas": {
                    "10-20": 7.800000000000001,
                    "0-10": 5.800000000000001
                },
                "xpPerMinDeltas": {
                    "10-20": 537.7,
                    "0-10": 402.70000000000005
                },
                "goldPerMinDeltas": {
                    "10-20": 432.1,
                    "0-10": 254.3
                },
                "csDiffPerMinDeltas": {
                    "10-20": -0.0999999999999992,
                    "0-10": 6.661338147750939e-16
                },
                "xpDiffPerMinDeltas": {
                    "10-20": -5.000000000000028,
                    "0-10": -73.79999999999998
                },
                "damageTakenPerMinDeltas": {
                    "10-20": 1320.4,
                    "0-10": 849.3
                },
                "damageTakenDiffPerMinDeltas": {
                    "10-20": 598,
                    "0-10": 405
                },
                "role": "SOLO",
                "lane": "TOP"
            }
        },
        {
            "participantId": 7,
            "teamId": 200,
            "championId": 106,
            "spell1Id": 11,
            "spell2Id": 4,
            "stats": {
                "participantId": 7,
                "win": false,
                "item0": 2055,
                "item1": 1401,
                "item2": 3742,
                "item3": 1033,
                "item4": 3009,
                "item5": 0,
                "item6": 3364,
                "kills": 3,
                "deaths": 4,
                "assists": 1,
                "largestKillingSpree": 2,
                "largestMultiKill": 1,
                "killingSprees": 1,
                "longestTimeSpentLiving": 754,
                "doubleKills": 0,
                "tripleKills": 0,
                "quadraKills": 0,
                "pentaKills": 0,
                "unrealKills": 0,
                "totalDamageDealt": 87374,
                "magicDamageDealt": 42905,
                "physicalDamageDealt": 40139,
                "trueDamageDealt": 4329,
                "largestCriticalStrike": 0,
                "totalDamageDealtToChampions": 8159,
                "magicDamageDealtToChampions": 3123,
                "physicalDamageDealtToChampions": 4293,
                "trueDamageDealtToChampions": 742,
                "totalHeal": 4350,
                "totalUnitsHealed": 1,
                "damageSelfMitigated": 22386,
                "damageDealtToObjectives": 1966,
                "damageDealtToTurrets": 0,
                "visionScore": 18,
                "timeCCingOthers": 13,
                "totalDamageTaken": 24767,
                "magicalDamageTaken": 10103,
                "physicalDamageTaken": 13473,
                "trueDamageTaken": 1191,
                "goldEarned": 7303,
                "goldSpent": 7200,
                "turretKills": 0,
                "inhibitorKills": 0,
                "totalMinionsKilled": 37,
                "neutralMinionsKilled": 82,
                "neutralMinionsKilledTeamJungle": 65,
                "neutralMinionsKilledEnemyJungle": 0,
                "totalTimeCrowdControlDealt": 278,
                "champLevel": 11,
                "visionWardsBoughtInGame": 4,
                "sightWardsBoughtInGame": 0,
                "wardsPlaced": 3,
                "wardsKilled": 4,
                "firstBloodKill": false,
                "firstBloodAssist": false,
                "firstTowerKill": false,
                "firstTowerAssist": false,
                "firstInhibitorKill": false,
                "firstInhibitorAssist": false,
                "combatPlayerScore": 0,
                "objectivePlayerScore": 0,
                "totalPlayerScore": 0,
                "totalScoreRank": 0,
                "playerScore0": 0,
                "playerScore1": 0,
                "playerScore2": 0,
                "playerScore3": 0,
                "playerScore4": 0,
                "playerScore5": 0,
                "playerScore6": 0,
                "playerScore7": 0,
                "playerScore8": 0,
                "playerScore9": 0,
                "perk0": 8005,
                "perk0Var1": 1003,
                "perk0Var2": 649,
                "perk0Var3": 353,
                "perk1": 9111,
                "perk1Var1": 186,
                "perk1Var2": 80,
                "perk1Var3": 0,
                "perk2": 9105,
                "perk2Var1": 20,
                "perk2Var2": 40,
                "perk2Var3": 0,
                "perk3": 8299,
                "perk3Var1": 230,
                "perk3Var2": 0,
                "perk3Var3": 0,
                "perk4": 8275,
                "perk4Var1": 15,
                "perk4Var2": 0,
                "perk4Var3": 0,
                "perk5": 8234,
                "perk5Var1": 7835,
                "perk5Var2": 0,
                "perk5Var3": 0,
                "perkPrimaryStyle": 8000,
                "perkSubStyle": 8200,
                "statPerk0": 5005,
                "statPerk1": 5008,
                "statPerk2": 5002
            },
            "timeline": {
                "participantId": 7,
                "creepsPerMinDeltas": {
                    "10-20": 1.2999999999999998,
                    "0-10": 1.4
                },
                "xpPerMinDeltas": {
                    "10-20": 284.2,
                    "0-10": 384.1
                },
                "goldPerMinDeltas": {
                    "10-20": 257.5,
                    "0-10": 314.7
                },
                "damageTakenPerMinDeltas": {
                    "10-20": 949.3,
                    "0-10": 560.5
                },
                "role": "NONE",
                "lane": "JUNGLE"
            }
        },
        {
            "participantId": 8,
            "teamId": 200,
            "championId": 43,
            "spell1Id": 14,
            "spell2Id": 4,
            "stats": {
                "participantId": 8,
                "win": false,
                "item0": 3853,
                "item1": 3174,
                "item2": 2055,
                "item3": 1028,
                "item4": 3158,
                "item5": 1004,
                "item6": 3364,
                "kills": 1,
                "deaths": 8,
                "assists": 4,
                "largestKillingSpree": 0,
                "largestMultiKill": 1,
                "killingSprees": 0,
                "longestTimeSpentLiving": 511,
                "doubleKills": 0,
                "tripleKills": 0,
                "quadraKills": 0,
                "pentaKills": 0,
                "unrealKills": 0,
                "totalDamageDealt": 15770,
                "magicDamageDealt": 12860,
                "physicalDamageDealt": 2286,
                "trueDamageDealt": 623,
                "largestCriticalStrike": 0,
                "totalDamageDealtToChampions": 8336,
                "magicDamageDealtToChampions": 6769,
                "physicalDamageDealtToChampions": 991,
                "trueDamageDealtToChampions": 575,
                "totalHeal": 468,
                "totalUnitsHealed": 2,
                "damageSelfMitigated": 10572,
                "damageDealtToObjectives": 215,
                "damageDealtToTurrets": 215,
                "visionScore": 62,
                "timeCCingOthers": 16,
                "totalDamageTaken": 15802,
                "magicalDamageTaken": 6364,
                "physicalDamageTaken": 9014,
                "trueDamageTaken": 423,
                "goldEarned": 5326,
                "goldSpent": 4550,
                "turretKills": 0,
                "inhibitorKills": 0,
                "totalMinionsKilled": 15,
                "neutralMinionsKilled": 0,
                "neutralMinionsKilledTeamJungle": 0,
                "neutralMinionsKilledEnemyJungle": 0,
                "totalTimeCrowdControlDealt": 121,
                "champLevel": 9,
                "visionWardsBoughtInGame": 7,
                "sightWardsBoughtInGame": 0,
                "wardsPlaced": 35,
                "wardsKilled": 13,
                "firstBloodKill": false,
                "firstBloodAssist": false,
                "firstTowerKill": false,
                "firstTowerAssist": false,
                "firstInhibitorKill": false,
                "firstInhibitorAssist": false,
                "combatPlayerScore": 0,
                "objectivePlayerScore": 0,
                "totalPlayerScore": 0,
                "totalScoreRank": 0,
                "playerScore0": 0,
                "playerScore1": 0,
                "playerScore2": 0,
                "playerScore3": 0,
                "playerScore4": 0,
                "playerScore5": 0,
                "playerScore6": 0,
                "playerScore7": 0,
                "playerScore8": 0,
                "playerScore9": 0,
                "perk0": 8214,
                "perk0Var1": 599,
                "perk0Var2": 312,
                "perk0Var3": 0,
                "perk1": 8275,
                "perk1Var1": 7,
                "perk1Var2": 0,
                "perk1Var3": 0,
                "perk2": 8210,
                "perk2Var1": 0,
                "perk2Var2": 0,
                "perk2Var3": 0,
                "perk3": 8237,
                "perk3Var1": 344,
                "perk3Var2": 0,
                "perk3Var3": 0,
                "perk4": 8136,
                "perk4Var1": 13,
                "perk4Var2": 30,
                "perk4Var3": 0,
                "perk5": 8106,
                "perk5Var1": 2,
                "perk5Var2": 0,
                "perk5Var3": 0,
                "perkPrimaryStyle": 8200,
                "perkSubStyle": 8100,
                "statPerk0": 5008,
                "statPerk1": 5008,
                "statPerk2": 5002
            },
            "timeline": {
                "participantId": 8,
                "creepsPerMinDeltas": {
                    "10-20": 1.1,
                    "0-10": 0.4
                },
                "xpPerMinDeltas": {
                    "10-20": 154.89999999999998,
                    "0-10": 227.2
                },
                "goldPerMinDeltas": {
                    "10-20": 238,
                    "0-10": 186.3
                },
                "csDiffPerMinDeltas": {
                    "10-20": -0.44999999999999973,
                    "0-10": -0.10000000000000009
                },
                "xpDiffPerMinDeltas": {
                    "10-20": -256.9,
                    "0-10": -17
                },
                "damageTakenPerMinDeltas": {
                    "10-20": 559.2,
                    "0-10": 327.2
                },
                "damageTakenDiffPerMinDeltas": {
                    "10-20": 114.35000000000002,
                    "0-10": -39.30000000000001
                },
                "role": "DUO_SUPPORT",
                "lane": "BOTTOM"
            }
        },
        {
            "participantId": 9,
            "teamId": 200,
            "championId": 134,
            "spell1Id": 14,
            "spell2Id": 4,
            "stats": {
                "participantId": 9,
                "win": false,
                "item0": 1056,
                "item1": 3916,
                "item2": 3907,
                "item3": 1026,
                "item4": 3285,
                "item5": 3020,
                "item6": 3364,
                "kills": 4,
                "deaths": 6,
                "assists": 2,
                "largestKillingSpree": 0,
                "largestMultiKill": 1,
                "killingSprees": 0,
                "longestTimeSpentLiving": 353,
                "doubleKills": 0,
                "tripleKills": 0,
                "quadraKills": 0,
                "pentaKills": 0,
                "unrealKills": 0,
                "totalDamageDealt": 144664,
                "magicDamageDealt": 129818,
                "physicalDamageDealt": 11082,
                "trueDamageDealt": 3764,
                "largestCriticalStrike": 0,
                "totalDamageDealtToChampions": 14321,
                "magicDamageDealtToChampions": 12780,
                "physicalDamageDealtToChampions": 1126,
                "trueDamageDealtToChampions": 414,
                "totalHeal": 0,
                "totalUnitsHealed": 0,
                "damageSelfMitigated": 5118,
                "damageDealtToObjectives": 3854,
                "damageDealtToTurrets": 1845,
                "visionScore": 22,
                "timeCCingOthers": 20,
                "totalDamageTaken": 11810,
                "magicalDamageTaken": 6746,
                "physicalDamageTaken": 4558,
                "trueDamageTaken": 505,
                "goldEarned": 10747,
                "goldSpent": 10850,
                "turretKills": 2,
                "inhibitorKills": 0,
                "totalMinionsKilled": 194,
                "neutralMinionsKilled": 23,
                "neutralMinionsKilledTeamJungle": 13,
                "neutralMinionsKilledEnemyJungle": 7,
                "totalTimeCrowdControlDealt": 254,
                "champLevel": 14,
                "visionWardsBoughtInGame": 4,
                "sightWardsBoughtInGame": 0,
                "wardsPlaced": 9,
                "wardsKilled": 2,
                "firstBloodKill": false,
                "firstBloodAssist": false,
                "firstTowerKill": false,
                "firstTowerAssist": false,
                "firstInhibitorKill": false,
                "firstInhibitorAssist": false,
                "combatPlayerScore": 0,
                "objectivePlayerScore": 0,
                "totalPlayerScore": 0,
                "totalScoreRank": 0,
                "playerScore0": 0,
                "playerScore1": 0,
                "playerScore2": 0,
                "playerScore3": 0,
                "playerScore4": 0,
                "playerScore5": 0,
                "playerScore6": 0,
                "playerScore7": 0,
                "playerScore8": 0,
                "playerScore9": 0,
                "perk0": 8230,
                "perk0Var1": 11,
                "perk0Var2": 0,
                "perk0Var3": 0,
                "perk1": 8226,
                "perk1Var1": 250,
                "perk1Var2": 695,
                "perk1Var3": 0,
                "perk2": 8210,
                "perk2Var1": 0,
                "perk2Var2": 0,
                "perk2Var3": 0,
                "perk3": 8236,
                "perk3Var1": 24,
                "perk3Var2": 0,
                "perk3Var3": 0,
                "perk4": 8345,
                "perk4Var1": 3,
                "perk4Var2": 0,
                "perk4Var3": 0,
                "perk5": 8347,
                "perk5Var1": 0,
                "perk5Var2": 0,
                "perk5Var3": 0,
                "perkPrimaryStyle": 8200,
                "perkSubStyle": 8300,
                "statPerk0": 5005,
                "statPerk1": 5008,
                "statPerk2": 5003
            },
            "timeline": {
                "participantId": 9,
                "creepsPerMinDeltas": {
                    "10-20": 9.1,
                    "0-10": 8.100000000000001
                },
                "xpPerMinDeltas": {
                    "10-20": 617.9,
                    "0-10": 477.1
                },
                "goldPerMinDeltas": {
                    "10-20": 495.5,
                    "0-10": 313.5
                },
                "damageTakenPerMinDeltas": {
                    "10-20": 465.59999999999997,
                    "0-10": 271.4
                },
                "role": "SOLO",
                "lane": "MIDDLE"
            }
        },
        {
            "participantId": 10,
            "teamId": 200,
            "championId": 22,
            "spell1Id": 4,
            "spell2Id": 7,
            "stats": {
                "participantId": 10,
                "win": false,
                "item0": 1055,
                "item1": 3153,
                "item2": 2055,
                "item3": 3086,
                "item4": 1042,
                "item5": 3006,
                "item6": 3363,
                "kills": 0,
                "deaths": 6,
                "assists": 4,
                "largestKillingSpree": 0,
                "largestMultiKill": 0,
                "killingSprees": 0,
                "longestTimeSpentLiving": 747,
                "doubleKills": 0,
                "tripleKills": 0,
                "quadraKills": 0,
                "pentaKills": 0,
                "unrealKills": 0,
                "totalDamageDealt": 76730,
                "magicDamageDealt": 1230,
                "physicalDamageDealt": 71804,
                "trueDamageDealt": 3695,
                "largestCriticalStrike": 130,
                "totalDamageDealtToChampions": 7591,
                "magicDamageDealtToChampions": 1130,
                "physicalDamageDealtToChampions": 6460,
                "trueDamageDealtToChampions": 0,
                "totalHeal": 966,
                "totalUnitsHealed": 2,
                "damageSelfMitigated": 5777,
                "damageDealtToObjectives": 2329,
                "damageDealtToTurrets": 2329,
                "visionScore": 22,
                "timeCCingOthers": 27,
                "totalDamageTaken": 13470,
                "magicalDamageTaken": 7177,
                "physicalDamageTaken": 5980,
                "trueDamageTaken": 312,
                "goldEarned": 7739,
                "goldSpent": 6975,
                "turretKills": 1,
                "inhibitorKills": 0,
                "totalMinionsKilled": 190,
                "neutralMinionsKilled": 0,
                "neutralMinionsKilledTeamJungle": 0,
                "neutralMinionsKilledEnemyJungle": 0,
                "totalTimeCrowdControlDealt": 496,
                "champLevel": 12,
                "visionWardsBoughtInGame": 3,
                "sightWardsBoughtInGame": 0,
                "wardsPlaced": 7,
                "wardsKilled": 6,
                "firstBloodKill": false,
                "firstBloodAssist": false,
                "firstTowerKill": false,
                "firstTowerAssist": false,
                "firstInhibitorKill": false,
                "firstInhibitorAssist": false,
                "combatPlayerScore": 0,
                "objectivePlayerScore": 0,
                "totalPlayerScore": 0,
                "totalScoreRank": 0,
                "playerScore0": 0,
                "playerScore1": 0,
                "playerScore2": 0,
                "playerScore3": 0,
                "playerScore4": 0,
                "playerScore5": 0,
                "playerScore6": 0,
                "playerScore7": 0,
                "playerScore8": 0,
                "playerScore9": 0,
                "perk0": 8008,
                "perk0Var1": 1,
                "perk0Var2": 30,
                "perk0Var3": 0,
                "perk1": 8009,
                "perk1Var1": 600,
                "perk1Var2": 400,
                "perk1Var3": 0,
                "perk2": 9104,
                "perk2Var1": 17,
                "perk2Var2": 20,
                "perk2Var3": 0,
                "perk3": 8017,
                "perk3Var1": 175,
                "perk3Var2": 0,
                "perk3Var3": 0,
                "perk4": 8345,
                "perk4Var1": 3,
                "perk4Var2": 0,
                "perk4Var3": 0,
                "perk5": 8410,
                "perk5Var1": 62,
                "perk5Var2": 0,
                "perk5Var3": 0,
                "perkPrimaryStyle": 8000,
                "perkSubStyle": 8300,
                "statPerk0": 5005,
                "statPerk1": 5008,
                "statPerk2": 5002
            },
            "timeline": {
                "participantId": 10,
                "creepsPerMinDeltas": {
                    "10-20": 9.8,
                    "0-10": 9.1
                },
                "xpPerMinDeltas": {
                    "10-20": 482.5,
                    "0-10": 369
                },
                "goldPerMinDeltas": {
                    "10-20": 383.79999999999995,
                    "0-10": 300.3
                },
                "csDiffPerMinDeltas": {
                    "10-20": -0.44999999999999973,
                    "0-10": -0.10000000000000009
                },
                "xpDiffPerMinDeltas": {
                    "10-20": -256.9,
                    "0-10": -17
                },
                "damageTakenPerMinDeltas": {
                    "10-20": 760.7,
                    "0-10": 192
                },
                "damageTakenDiffPerMinDeltas": {
                    "10-20": 114.35000000000002,
                    "0-10": -39.30000000000001
                },
                "role": "DUO_CARRY",
                "lane": "BOTTOM"
            }
        }
    ],
    "participantIdentities": [
        {
            "participantId": 1,
            "player": {
                "platformId": "KR",
                "accountId": "B0G198hu4qK7j8D56-hiCTJhfVgOAbg95WiJgF68Yyir2Cg",
                "summonerName": "HLE Viper",
                "summonerId": "UUKM-Yfix1XzC-mbPJNhqV9Codhv8hGvjfQpPwVsAXQo6vs",
                "currentPlatformId": "KR",
                "currentAccountId": "B0G198hu4qK7j8D56-hiCTJhfVgOAbg95WiJgF68Yyir2Cg",
                "matchHistoryUri": "/v1/stats/player_history/KR/209173070",
                "profileIcon": 7
            }
        },
        {
            "participantId": 2,
            "player": {
                "platformId": "KR",
                "accountId": "CZOKWXEJysdK-Kq6O5PC4q4GMi5OccyRV1okB2UrPsMRRhg",
                "summonerName": "Lehends",
                "summonerId": "fKWlbCMcK9B5ZBKGwg06dKu7tuvDVfw1-dY4M90lvxqPKXM",
                "currentPlatformId": "KR",
                "currentAccountId": "CZOKWXEJysdK-Kq6O5PC4q4GMi5OccyRV1okB2UrPsMRRhg",
                "matchHistoryUri": "/v1/stats/player_history/KR/204098604",
                "profileIcon": 4295
            }
        },
        {
            "participantId": 3,
            "player": {
                "platformId": "KR",
                "accountId": "KeU7EWsN4M_49nHyece2ErlHksjMr4mjjP1jD_A8czKL",
                "summonerName": "Hide on bush",
                "summonerId": "AVrX6592MexG63ACYtwUrXGKUupB67nzpIkA4Erb9LCtyw",
                "currentPlatformId": "KR",
                "currentAccountId": "KeU7EWsN4M_49nHyece2ErlHksjMr4mjjP1jD_A8czKL",
                "matchHistoryUri": "/v1/stats/player_history/KR/3440481",
                "profileIcon": 6
            }
        },
        {
            "participantId": 4,
            "player": {
                "platformId": "KR",
                "accountId": "OunEZ1MHk3ibd1jBz9qXjYDvnvzKjIq6tlQ_KVBjrRWEP8U2S9jhSlM4",
                "summonerName": "한화 영재",
                "summonerId": "Elt0b-sfmHuI23LOCnrwsCytGC4c9WnCqWg0SzIhPgbq7VE",
                "currentPlatformId": "KR",
                "currentAccountId": "OunEZ1MHk3ibd1jBz9qXjYDvnvzKjIq6tlQ_KVBjrRWEP8U2S9jhSlM4",
                "matchHistoryUri": "/v1/stats/player_history/KR/2035906704740128",
                "profileIcon": 3788
            }
        },
        {
            "participantId": 5,
            "player": {
                "platformId": "KR",
                "accountId": "BhnQsFsoX4_O8l6jzhZ6pTcPrLvjWEchHGaQerjnPcJK",
                "summonerName": "탑나라 룰루공주",
                "summonerId": "5UI5ejpq3WOMzZIMWHi7gF1SkaGsBy9AezgSq7QgQwFnZw",
                "currentPlatformId": "KR",
                "currentAccountId": "BhnQsFsoX4_O8l6jzhZ6pTcPrLvjWEchHGaQerjnPcJK",
                "matchHistoryUri": "/v1/stats/player_history/KR/3191578",
                "profileIcon": 4637
            }
        },
        {
            "participantId": 6,
            "player": {
                "platformId": "KR",
                "accountId": "ks_QEYhnYfA3KySbwThTBd4F5ixx2t9HJvjAvdAckBNv-kGggS30l4qw",
                "summonerName": "corgii",
                "summonerId": "1QWxla9WRFjp-P-U9UETg0l9-xevP34BxR5tgR01fMRM4a8",
                "currentPlatformId": "KR",
                "currentAccountId": "ks_QEYhnYfA3KySbwThTBd4F5ixx2t9HJvjAvdAckBNv-kGggS30l4qw",
                "matchHistoryUri": "/v1/stats/player_history/KR/2441394028982080",
                "profileIcon": 16
            }
        },
        {
            "participantId": 7,
            "player": {
                "platformId": "KR",
                "accountId": "9F4OyB4Hh7Jhz341v82cjveyoo-15zyt6aiRJ4VAoGb5",
                "summonerName": "한화 큐베",
                "summonerId": "cLZR__v-g_1RbDAnOTglULckb6l38jwnk_ycg9tqfcXlnw",
                "currentPlatformId": "KR",
                "currentAccountId": "9F4OyB4Hh7Jhz341v82cjveyoo-15zyt6aiRJ4VAoGb5",
                "matchHistoryUri": "/v1/stats/player_history/KR/1309737",
                "profileIcon": 3839
            }
        },
        {
            "participantId": 8,
            "player": {
                "platformId": "KR",
                "accountId": "Pm4-TUou-DbNoQolRb87ehEs26HTEdUqK9Zk-th6Lk5t5PTUn_r09qMJ",
                "summonerName": "댕청잇",
                "summonerId": "kbL8Yj4z_8EdEyjQ9RekrMFo22TEv_FLa7e44GX8wMswn38",
                "currentPlatformId": "KR",
                "currentAccountId": "Pm4-TUou-DbNoQolRb87ehEs26HTEdUqK9Zk-th6Lk5t5PTUn_r09qMJ",
                "matchHistoryUri": "/v1/stats/player_history/KR/2021724626021952",
                "profileIcon": 4657
            }
        },
        {
            "participantId": 9,
            "player": {
                "platformId": "KR",
                "accountId": "GIn4xt4gDQnFgJVE3AW8Cusfkz_tPjeTw3IknEQ0NhHYUhF63hOwYTyg",
                "summonerName": "가위바위보달인",
                "summonerId": "pcQUOFyw4DRQLqucczom6heY6Zh9OOUyI0Htti03DFxKG_4",
                "currentPlatformId": "KR",
                "currentAccountId": "GIn4xt4gDQnFgJVE3AW8Cusfkz_tPjeTw3IknEQ0NhHYUhF63hOwYTyg",
                "matchHistoryUri": "/v1/stats/player_history/KR/2045870080569152",
                "profileIcon": 2092
            }
        },
        {
            "participantId": 10,
            "player": {
                "platformId": "KR",
                "accountId": "OBxtlWbEWyVIhl_yTS46m0R0LQny2oMAth4LXHXOecHVjk06PhQ5jAdG",
                "summonerName": "wohennangu0",
                "summonerId": "tbqA86z7plC3j8a6M54mGDUVMocHyvhg0dhDTMS_avgpigA",
                "currentPlatformId": "KR",
                "currentAccountId": "OBxtlWbEWyVIhl_yTS46m0R0LQny2oMAth4LXHXOecHVjk06PhQ5jAdG",
                "matchHistoryUri": "/v1/stats/player_history/KR/2021819061333184",
                "profileIcon": 20
            }
        }
    ]
}

 

 

 

 

 

 

 

 

 

'낙서장' 카테고리의 다른 글

노션  (0) 2020.08.06
이력서 자기소개서 작성법  (1) 2020.08.05
git // 깃헙 리파지토리 내용 바꾸기  (0) 2020.08.03
git 깃 // 공동작업 시 merge 머징 CONFLICT 문제 해결법  (0) 2020.07.30
최종 프로젝트 화면  (0) 2020.07.29

 

훅스

 

 

자바 - 멤버변수 메소드

자바스크립트 - 함수

 

함수형 프로그래밍

의존성배제

상태가 없다 (즉 멤버변수가 없다)

대신 state 를 넘겨준다 (DB에서 들고온 데이터를 state로 가져온다)

DB + 변수 + 함수파라미터 모두 동기화

 

의존성 배제

엔지니어가 가로등을 고치려면 망치와 사다리가 필요하다고 가정한다

엔지니어는 망치와 사다리에 의존적이다

 

1번가로등 고장 -> 정상

2번가로등 정상

 

이렇게 확인하여 고치는 것이 아니라 저장된 문서(DB)를 이용하여 고장확인을 하는 것

이것이 함수형

 

hooks

{useState}를 임포트해준다

0자리는 오브젝트자리

 

 

 

add 함수 추가

 

 

 

숫자가 증가한다

 

...(정규연산자)는 배열을 for문으로 뿌리는 것이라고 생각하면 됨

 

변경버튼을 누르면 비밀번호만 바뀐다

 

변수가 여러개 필요하다면 여러개 선언하면 된다

 

---------------------

함수형 컴포넌트에서 props 받으려면

괄호에 바로 넣어버리면 된다

---------------------

 

useEffect

클래스형 컴포넌트의 componentDidMount와 같다

 

 

change 함수 생성

 

여러번 눌러도 한번만 변경되고 더이상 변경되지 않는다

 

대괄호가 들어가면 최초실행시에만 콘솔로그가 뜬다

 

눌려도 렌더링 문구가 안뜬다 useEffect (초기화Constructor의 용도로 사용된다)

 

대괄호 안에 name을 넣으면

 

렌더링이 처음 + 이름변경 했을 때 한번 렌더링 문구가 뜬다

 

useEffect는 특정 값이 변경 되었을 때 캐치하고 싶은 경우!

 

숙제 = 용도 생각해보기

 

useReducer는 리덕스를 배워야한다 (상태관리)

 

----------------

 

useMemo (필수!)

axios 같은 것을 받을 때 메모에 저장

연산최적화 (shouldUpdateComponent)

 

자바스크립트의 reduce 는 누적값에 추가값을 더하거나 빼거나 처리

a는 누적값 b는 더할 값

 

e는 컨텍스트

e.target 은 input 태그

 

 

 

 

숫자를 넣을 때마다 평균값을 계산한다

렌더가 실행되면서 값 변한거있는지 찾는다

하지만 list 는 그대로라서 평균값은 그대로

 

값이 변경 되면 리렌더링 되서 괄호가있는 함수

getAverage(list)와

JSX {괄호}안에만 변경이된다

 

-----

 

memoAvg는 list 값이 변경 되었을 때만 실행하는 것

 

 

더보기
import React, { useState, useMemo } from "react";

const getAverage = (numbers) => {
  console.log("평균값 계산 중..");
  if (numbers.length === 0) return 0;
  const sum = numbers.reduce((a, b) => a + b); //
  console.log(sum);
  return sum / numbers.length;
};

const App = () => {
  const [list, setList] = useState([]);
  const [number, setNumber] = useState("");

  //useMemo(실행할함수,[변수,변수])
  const memoAvg = useMemo(() => getAverage(list), [list]);

  const onChange = (e) => {
    setNumber(e.target.value);
  };

  const onInsert = (e) => {
    const nextList = list.concat(parseInt(number));
    setList(nextList);
    setNumber("");
  };

  return (
    <div>
      <input value={number} onChange={onChange} />
      <button onClick={onInsert}>등록</button>
      <ul>
        {list.map((value, index) => (
          <li key={index}>{value}</li>
        ))}
      </ul>
      평균값: {memoAvg}
    </div>
  );
};

export default App;

 

---

useEffect와 useMemo 차이

useEffect 하나의 일이 발생했을 때 추가적인 일

useMemo 어떤 것이 변경 되었을 때 실행 (걸러주는 것 : 데이터 변경되면 실행 : ex 다운로드)

---------

+ useCallback

----------

ref는 DOM에 접근하는 유일한 방법

key는 해당 태그의 고유한 속성

useRef - 밸리데이션체크

특이한 문법

자바스크립트에서 변수만들 때 변수를 동적으로 만들고 싶을 때 

리액트에서는 값을 변수이름으로 쓸 수 있다 

-------------

 

화면시작하자마자 포커스를 주고 싶다

 

 

 

 

 

콘솔로 확인해보면 쓸 수 있는 속성들이 나온다 

 

 

 

 

커서가 가있고 배경색이 바뀌어 있다

 

 

 

 

'Web > ReactJS' 카테고리의 다른 글

리액트 // 스테이트를 훅스로 바꾸기  (0) 2020.08.05
리액트 자동완성 스니펫  (0) 2020.08.04
리액트 // 생명주기  (0) 2020.07.29
리액트 // axios / 프로미스 / async  (0) 2020.07.28
리액트 // URL파라미터 받기  (0) 2020.07.27

 

전역공간에 버튼 추가

 

 

onCreateView 설정

1. 인플레이터를 이용하여 ViewGroup rootView을 만들어주고

2. 버튼을 rootView에서 찾는다

3. 버튼에 클릭 리스너를 추가하고 Intent intent에 첫번째 인자에 현재 액티비티, 두번째 인자에 이동할 액티비티를 추가고 startActivity(intent)를 하여 이동하게 만든다

4. 무조건 아까 만든 rootView를 리턴해야한다

 

 

+ Recent posts