Skip to main content

· One min read
  1. 안드로이드 서비스 스레드 안에서 토스트 사용
  • Thread에서 Toast 직접 사용 불가
  • 보통 Thread에서 사용 하는 MainActivity.this.runOnUiThread()도 Service에서는 사용 불가
  • Handler를 사용하여 처리
  • 서비스 클래스 안에서 멤버 변수 선언
    • Handler handler;
    • onCreate() 내부에서 초기화
    • handler = new Handler();
    • 함수 추가
    • private void _runOnUiTHread(Runnable runnable) { handler.post(runnable); }
    • 원하는 토스트 띄우기
    • _runOnUiThread(new Runnable() { public void run() { Thoast.makeText(getApplicationContext(), "Message", Toast.LENGTH_LONG).show(); } });

· 2 min read
  1. Markdown 이란
  • 일반 텍스트 문서의 양식을 편집하는 문법
  • README 파일이나 온라인 문서, 혹은 일반 텍스트 편집기로 문서 양식을 편집할 때 사용
  • 쉽게 HTML 등 다른 문서형태로 변화이 가능
  1. Markdown 문법
  • 헤더: 제목, 문단별 제목을 쓰고 싶을 때

    • 제목 1단계

    • 제목 2단계

    • 제목 3단계

    • 제목 4단계

    • 제목 5단계
  • 수평선: 내용을 명시적으로 구분하고 싶을 때


  • 엔터키(줄바꿈, 개행): 라인을 바꾸고 싶을 때

    • 띄어쓰기 2번 입력
  • 목록(List): 요소를 나열할 때

      1. 첫번째
      1. 두번째
      1. 세번째
    • +, -, *, +
  • 강조: 문장 내 강조하고 싶은 단어를 눈에 띄게

    • 볼드(진하기)
    • 이탤릭체(기울여서)
    • 취소선
    • 밑줄
    • 볼드로 진하게 만들다가이탤릭으로 기울이고다시 볼드로(중복 활용 가능)
  • 인용구: 인용할 경우 또는 분위기 전환시에도 사용(중복 형태 가능)

    • 테스트

    • 테스트2

    • 테스트3

  • 링크(Link): 클릭하면 다른 페이지, 다른 부분으로 이동

· 14 min read
  1. 인플레이션
  • XML 레이아웃에 정의된 내용이 메모리에 객체화되는 과정
  • setContentView() 함수가 내부적으로 인플레이션 작업 실행
  • 인플레이션 작업 하기 전에 xml 파일에 접근하면 널 포인트 에러 발생
  • 전체 화면 중 일부분만 차지하는 화면 구성요소들을 XML레이아웃에서 로딩
    • getSystemService(Context.LAYOUT_INFLATER_SERVICE)
    • LayoutInflater라는 클래스 제공하며, 이 클래스는 시스템 서비스로 제공된다.
    • LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); inflater.inflate(R.layout.sub1, container, true);
  1. 액티비티 생명주기
  • 실행(Running): 화면 상에 액티비타가 보이면서 실행되어 있는 상태, 액티비티 스택의 최상위에 있으며 포커스를 가지고 있음
  • 일시 중지(Paused): 사용자에게 보이기는 하지만 다른 액티비티가 위에 있어 포커스를 받지 못하는 상태, 대화상자가 위에 있어 일부가 가려져 있는 경우에 해당
  • 중지(Stopped): 다른 액티비티에 의해 완전히 가려져 보이지 않는 상태
  1. 생명주기를 활용한 데이터 저장
  • onCreate -> onStart -> onResume -> onPuase -> onStop -> onDestroy
  • onPause 에서 데이터 저장 후 onResume에서 데이터 복구
  • onPuase
    • SharedPreferences pref = getSharedPreference("pref", Activity.MODE_PRIVATE);
    • SharedPreferences.Editor editor = pref.edit();
    • editor.putString("name", "davidyoon");
    • editor.commit();
  • onResumse
    • SharedPreferences pref = getSharedPreferences("pref", Activity.MODE_PRIVATE);
    • if ( pref != null) { String name = pref.getString("name"); }
  1. 서비스
  • 서비스는 화면이 없는 상태에서 백그라운드로 실행됨

  • 서비스는 프로세스가 종료되어도 시스템에서 자동으로 재시작함

  • 서비스 생명주기

    • onCreate -> onDestroy
    • startService()
  • 액티비티에서 서비스로 데이터 전달

    • Intent intent = new Intent(getApplicationContext(), MyService.class);
    • intent.putExtra("command", "show");
    • startService(intent);
  • onCreate 는 한 번 만들어 지고 새로 만들어지지 않는다.

    • 결국 데이터 처리는 onCreate가 아닌 onStartComamnd(Intent intent, int flags, int startId) 에서 처리
    • if ( intent == null) { return Service.START_STICKY }
    • START_STICKY : 서비스가 종료되었을 떄에도 다시 시작해 달라는 의미
  • Service 에서 Activity로 데이터 전달

    • Intent showIntent = new Intent(getApplicationContext(), MainActivity.class);
    • showIntent.addFlags(Intent.FlAG_ACTIVITY_NEW_TASK| Intent.FLAG_ACTIVITY_SINGLE_TOP| Intent.FLAG_ACTIVITY_CLEAR_TOP);
    • showIntent.putExtra("command", "show");
    • showIntent.putExtra("name", name + " from service.");
    • startActivity(showIntent);
  • Activity 에서 데이터 받기

    • onNewIntent(Intent intent) 사용
      • processComamnd(intent);
    • onCreate()에서도 처리
      • Intent passedIntent = getIntent()
      • processCommand(passedIntent);
    • processCommand(Intent intent)
    • if(intent != null) { String command = intent.getStringExtra("command"); String name = intent.getStringExtra("name"); }
  1. BroadCast Receiver
  • 어플리케이션이 글로벌 이벤트(Global Event)를 받아서 처리하려면 브로드캐스트 수신자로 등록
  • 글로벌 이벤트란 전화, 문자 메시지 와 같이 안드로이드 시스템 전체에 보내지는 메시지다
  • 브로드 캐스트 수신자는 인텐트필터를 포함하며, 매니페스트 파일에 등록함으로써 인텐트를 받을 준비를 한다
  • 수신자가 매니페스트 파일에 등록되었다면 따로 시작시키지 않아도 된다
  • 어플리케이션 컨텍스트 클래스의 registerReceiver 메소드를 이용하면 런터임 시에도 수신자를 등록할 수 있다
  • 서비스처럼 브로드캐스트 수신자도 UI가 없다
  • 인텐트와 브로드캐스트
    • 인텐트를 이용하여 액티비트를 실행하며 포그라운드(foreground)로 실행되어 사용자에게 보여지지만
    • 브로드캐스트를 이용해서 처리하면 백그라운드(background)로 동작하므로 사용자가 모름
    • 인텐트를 받으면 onReceive() 메소드가 자동으로 호출된다
  • 브로드캐스트의 구분
    • 브로드캐스트는 크게 두 가지 클래스로 구분된다
      • 일반 브로드캐스트(sendBroadcase() 메소드로 호출): 비동기적으로 실행되며 모든 수신자는 순서없이 실행된다 (때로는 동시에 실행됨) 효율적이나, 한 수신자의 처리 결과를 다른 수신자가 이용할 수 없고 중간에 취소가 불가능
      • 순차 브로드캐스트(sendOrderedBroadcase() 메소드로 호출): 한 번에 하나의 수신자에만 전달되므로 순서대로 실행됨. 중간에 취소하면 그 다음 수신자는 받지 못함. 수신자가 실행되는 순서는 인텐트필터의 속성으로 정할 수 있음. 순서가 같으면 임의로 실행된다
  1. SMS Receiver
  • BroadcastReceiver 상속 받는 Receiver 생성
  • onReceive() 메소드에서 intent 처리
  • Bundle bundle = intent.getExtras();
  • Object[] objs = (Object[]) bundle.get("pdus"); // SMS 표준 프로토콜 puds로 번들에서 object형태로 꺼내 사용
  • SmsMessage[] messages = new SmsMessage[objs.length]; //SmsMessage 객체에 object 넣어서 메시지 파싱
  • 마시멜로 이상 버전은 format 설정
    • String format = bundle.getString("format");
    • message[i] = SmsMessage.createFromPdu((byte[])objs[i], format);
  • 액티비티에 intent 전송 (화면이 없는 Receiver에서 화면으로)
    • sendToActivity(context, sender, contents, date)
    • Intent intent = new Intent(context, SmsActivity.class);
    • 데이터 put
      • intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK| Intent.FLAG_ACTIVITY_SINGLE_TOP| Intent.FLAG_ACTIVITY_CLEAR_TOP ); // 화면없는 곳에서 activity로 데이터 보낼때 셋팅
      • intent.putExtra("sender", sender);
      • Date to String foramt
        • private static SimpleDateForamt format = new SimpleDateFormat("yyyy-MM-dd HH:mm");
      • intent.putExtra("receivedDate", format.format(date));
      • context.startActivity(intent);
    • SmsActivity
      • onCreate()
      • Intent passedIntent = getIntent(); //getIntent로 받아서 처리
      • processCommand(passedIntent);
      • private void processCommand(Intent intent){ if (intent != null) { String sender = intent.getStringExtra("sender); } }
  • 실행한 Activity가 foreground 상태에서 Intent에 Extra 값을 추가하고 StartActivity를 호출하면 onCreate() 대신 onNewIntent(Intent intent)가 시랳ㅇ 되고 그 다음 onResume()이 호출된다.
  • 따라서 SmsActivity에서도 onNewIntent() 오버라이딩 해주어야 한다.
    • onNewIntent(Intent intent){ processCommand(intent); }
  1. Activity Flags
  • 안드로이드 Activity는 Stack 형태로 쌓이게 된다.
  • startActiviy로 activity를 호출할 때 FLAG 셋팅으로 Activity 스택을 제어할 필요하 있다.
  • FlAG 종류
    • Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT: 시스템에 의해 스택 관리되며 가장 기본 값이다.
    • Intent.FLAG_ACTIVITY_NEW_TASK: 새로운 테스크 생성, 기존에 열어놓은게 없으면 새로운 테스크 생성, 기존에 열어놓은게 있으면 그 테스트로 들어감.
    • Intent.FLAG_ACTIVITY_CLEAR_TOP: 상위 스택 제거, 실행하는 액티비티가 존재하면 새로 시작하지 않고 상위에 액티비티 모두 제거
    • Intent.FLAG_ACTIVITY_SINGLE_TOP: 액티비티가 이미 최상단에 있으면 다시 시작하지 않고 재사용, [ABCDE]가 있고, E에서 다시 E를 열면 onPuase() -> onNewIntent() -> onResume()
    • Intent.FLAG_ACTIVITY_CLEAR_TASK // 실행 액티비티 외 모두 제거
    • Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS // 최근 목록에서 제외.
    • Intent.FLAG_ACTIVITY_FORWARD_RESULT // result를 상위로 보냄. startActivityForResult()에서 사용.
    • Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP // onActivityResult()로 결과를 전달할 때 이전 액티비티로 돌아가도록 하기 위해 추가.
    • Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT // 멀티 윈도우 시 사용.
    • Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY // 시스템에 의해 설정됨. 최근 목록에서 실행되면 자동으로 붙음.
    • Intent.FLAG_ACTIVITY_MULTIPLE_TASK // FLAG_ACTIVITY_NEW_TASK와 함께 사용시 새 태스크 생성
    • Intent.FLAG_ACTIVITY_NEW_DOCUMENT // concurrent document 동시 문서에서 사용
    • Intent.FLAG_ACTIVITY_NO_ANIMATION // 액티비티 전환시 애니메이션 무시
    • Intent.FLAG_ACTIVITY_NO_HISTORY // 액티비티를 스택에 존재X (로딩화면 등)
    • Intent.FLAG_ACTIVITY_NO_USER_ACTION // onUserLeaveHint() 실행을 차단
    • Intent.FLAG_ACTIVITY_REORDER_TO_FRONT // 실행하는 액티비티를 최상위로 올려줌
    • Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED // 정리할 액티비티가 있으면 태스크를 리셋
    • Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET // 리셋하면 상위 태스크 모두 삭제
    • Intent.FLAG_ACTIVITY_TASK_ON_HOME // FLAG_ACTIVITY_NEW_TASK와 함께 사용. 현재 홈 태스크 위에 위치.
    • Intent.FLAG_ACTIVITY_MATCH_EXTERNAL // 전체 앱이 intent를 처리할 수 없을 때
    • Intent.FLAG_ACTIVITY_RETAIN_IN_RECENTS // 최근 목록에서 재실행할 수 있도록 유지.
    • Intent.FLAG_DEBUG_LOG_RESOLUTION // 디버깅 정보를 로그로 출력.
    • Intent.FLAG_INCLUDE_STOPPED_PACKAGES // stopped된 application도 target이 됨.
    • Intent.FLAG_EXCLUDE_STOPPED_PACKAGES // stopped된 application은 target이 되지 않음.
    • Intent.FLAG_FROM_BACKGROUND // 백그라운드 동작중을 알려줌.
    • Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION // URI 지속 권한
    • Intent.FLAG_GRANT_PREFIX_URI_PERMISSION // URI prefix match 권한.
    • Intent.FLAG_GRANT_READ_URI_PERMISSION // URI 읽기 권한.
    • Intent.FLAG_GRANT_WRITE_URI_PERMISSION // URI 쓰기 권한.
    • Intent.FLAG_RECEIVER_FOREGROUND // 포그라운드로 변경
    • Intent.FLAG_RECEIVER_NO_ABORT // 리시버가 브로드캐스트를 중지 못함.
    • Intent.FLAG_RECEIVER_REGISTERED_ONLY // 동적 리시버만 브로드캐스트 받음.
    • Intent.FLAG_RECEIVER_REPLACE_PENDING // 중복된 브로드캐스트를 제거.
    • Intent.FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS // 브로드캐스트가 instant app의 수신자에게 표시.
  1. 일반 권한과 위험 권한 (마시멜로 API 23 부터)
  • 설치시 권한 설정 했는데 유저들이 모두 OK 누르는 형태에서 문제 발생하여 23이상부터 변경
  • 위험 권한은 실행 시 권한 부여
  • 위험 권한
    • 위치
    • 카메라
    • 마이크
    • 연락처
    • 전화
    • 문자
    • 일정
    • 센서
  • 퍼미션 체크
    • int permissionCheck = ContextCompact.checkSelfPermission(this, Manifest.permission.RECEIVE_SMS);
    • if (permissionCheck == PackageManger.PERMISSION_GRADNTED)
    • 퍼미션 거절
      • if (ActivityCompat.shouldShowRequestPermisionRationale(this, Manifest.permission.RECEIVE_SMS))
    • 퍼미션 요청 창 띄우기
      • ActivityCompact.requestPermssions(this, new String[] {Manifest.permission.RECEIVE_SMS}, 1);
  • 퍼미션 요청 결과 콜백 함수
    • onRequestPermissionResult(requestCode, permissions, gratResults)
    • switch (requestCode) { case 1: if (grantResults.length > 0) { if ( grantResults[0] == PackageManager.PERMISSION_GRANTED) { //토스트 메시지 승인 } } }
  1. 다양한 위젯과 이벤트 활용
  • 대표적 이벤트
    • 터치: 화면을 손가락으로 누를 떄 발생
    • 키: 키패드나 하드웨어 버튼을 누를 떄 발생
    • 제스처: 터치 이벤트 중에서 일정 패턴을 만들어 내는 이벤트
    • 포커스: 뷰마다 순서대로 주어지는 포커스
    • 화면 방향 변경: 화면의 방향이 가로/세로로 바뀜에 따라 발생하는 이벤트
  • 제스처를 통해 처리할 수 있는 이벤트
    • onDown(): 화면이 눌렸을 경우
    • onShowPress(): 화면이 눌렸다 뗴어지는 경우
    • onSingleTapUp(): 화면이 한 손가락으로 눌렸다 뗴어지는 경우
    • onSingleTapConfirmed(): 화면이 한 손가락으로 눌려지는 경우
    • onDoubleTap(): 화면이 두 손가락으로 눌려지는 경우
    • onDoubleTapEvent(): 화면이 두 손가락으로 눌려진 상태에서 뗴거나 이동하는 등 세부적인 액션을 취하는 경우
    • onScroll(): 화면이 눌린 채 일정힌 속도와 방향으로 움직였다 떼는 경우
    • onFling(): 화면이 눌린 채 가속도를 붙여 손가락을 움직였다 떼는 경우
    • onLongPress(): 화면을 손가락으로 오래 누르는 경우
  1. 가로 세로 전환
  • res/layout-land 폴더 생성 후 activity_main.xml 복사 해서 붙여넣기
  • 2 개의 액티비티를 가로 세로에 따라서 새로 띄우고 꺼지고 반복 된다.
  • onSaveInstanceState() 함수 오버라이딩 해서 저장된 값을 불러와서 사용 가능.
  • 동일한 PlainText(EditView)에는 자동으로 값 저장되게 최신버전의 안드로이드는 변경 되었다.
  • 한 액티비티에서 가로 세로 전환
    • onConfigurationChanged() 함수 오버라이드
    • 상태가 변할 때 마다 호출되는 함수
    • newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE 등으로 조건문 붙여서 처리 가능.

· 8 min read
  1. 화장품 시장
  • 코로나 이후 직격탄, 외출x, 마스크
  • 최근 미국에서 마스크 벗기 시작
  • 아모레퍼시픽, LG생활건강
    • 2~5조
    • 1.2조
    • 주가 반등 시작
  • 세계 1위 화장품 기업: 로레알
    • 2019년 매출 40조, 영업이익 7조, 프랑스 기업
    • 대표 브랜드: 랑콤
    • 로레알 주가 급상승 중 (역사적 최고점)
    • 매출에 타격 없고 영업이익은 유지
    • 고급 상품 위주로 판매건수 상승
    • 자산가격 상승으로 자산 소유 층 증대
    • 특히 신흥 아시아 시장의 강한 성장
    • 아시아 시장 공약(중국)
    • 코로나 전에는 한국 화장품 점유율이 높았음 in China
    • 로레알 '스타일난다' 2018년에 지분 100% 인수 6000억
      • 색조브랜드
      • 코로나이후 영업이익 바닥
      • 1300억 회수
  • 세계 2위 화장품 기업: 에스티 로더
    • 1946년 창업한 미국 기업
    • DKNY, Tommy 등
    • 로레알과 비슷한 주가 상승 중
    • 한국 2019년 닥터자르트 2조원에 인수
      • 투자금 2208억원 회수
  • 세계 3위 화장품 기업: 유니레버
    • 생활용품 기업
    • Dove
    • 2017년 'AHC' 카버코리아 3조원에 인수
      • 2년째 하락 중
  • 중국 화장품 시장 코로나에도 9.5% 성장
    • 20~40세 여성 약 2억명
    • 1인당 화장품 소비 약 50달러, 선진국은 보통 300달러, 홍콩은 475달러
      • 미래 폭팔적 성장 가능성
    • 색조화장품, 스킨케어
    • 30~60%씩 성장하는 중국 화장품 수입
      • 수입 1위 일본, 2위 프랑스, 3위 한국
      • 최근 중국인은 고급 프랑스 화장품 구매 욕구 상승중-> 한국 기업 타격
    • 중국 코로나 종식중
      • 한국 화장품수출 11개월 연속 신기록 중
  1. 고 이건희 지분상속 마무리
  • 총 상속세 12조원 + @
  • 삼성전자 법정 비율대로 상속
  • 삼성생명 이재용 부회장 50% 상속
    • 삼성생명 삼성전자 8.8%
    • 삼성물산 삼성전자 5%
    • 부인 5조 자신 5,4,4 로 상속세 납부
  • 매년 2조원씩 분납
  • LG그룹 9200억 롯데 4500억 한진 2700억 삼성그룹 12조이상
  • 경총 발표 한국 상속세율 OECD 1위
    • 30억 초가 50%
  • 의료 기부 1조원
  • 미술품 23,000 여점 국립기관 기증
  • 이건희 특별관 가능성
    • 개인적 의견: 서울시에 국가 규모로 큰 박물관 건설하면 좋을듯
  • 기부 및 비율 상속
  1. 삼성전자 1분기 실적
  • 영업이익 9조 3000억 어닝 서프라이즈
    • 모바일 4.4조 소비자가전 1.1조
    • 반도체 3.3조
  • 주가는 ?
    • 부진 -> 최근 코로나 상승으로 조정 진행중 의견
    • 오스틴공장 타격
  • 미래는 ?
    • 반도체만 6조 예상, 슈퍼 사이클
    • 파운드리 경쟁
    • TSMC 설비투자 300억 달러
    • Intel 파운드리 22조 투자
    • SK하이닉스, 파운드리 투자할 것(8인치에 집중)
    • 삼성 1분기에 시설투자 9.7조
    • 현금 보유량 131조 8650 억
      • ROE 감소
    • 역대급 투자 계획 가능성 상승 100조원 예상
    • 평택 p3공장 예상액 50조
    • 미국 공장 20조
    • M&A NXP 반도체 인수 가능성 50조~70조
      • NXP 차량용 반도체
      • 2016년 퀄컴 NXP 인수 선언 50조 -> 미국 정부 승인 X -> 계약금 2조 포기
      • 소프트뱅크 비전펀드가 100조
      • 바이든 반도체, 배터리 공급망 검토 지시
        • 6월 발표 예정
        • 백악관 반도체 회의
        • 중국 반도체 말고도 미국에도 반도체 공장 지어라 지시 가능성
      • 대만 TSMC 중국에 3조원 반도체 투자 계획 발표
        • 중국 반응 미지근
        • 28나노미터 차량용 반도체
        • 미국에서는 애리조나 공장 5나노 반도체 라인
        • 중국 TSMC 중국 투자 계획 중지 논의
    • 반도체 주가가 움직이지 않는 이유?
      • 국가간 경쟁 및 상호 배제
      • 자체 반도체 라인 증설 -> 공급 과잉 및 생성 비요율성 증대
      • 자유 무역효과 감소(핵심)
  • 반도체 장비 회사는 ?
    • ASML 주가 상승
  1. SKIET 공모가 10만 5000원 확정
  • 공모가 기준 시가총액 약 7.5조원
  • 수요 예측 기관 경쟁률 1882.88대 1
  • 배터리 분리막 제조 기업
    • SK 이노베이션 자회사 90%
    • 20년 매출약 4690억, 당기순이익 881억
    • 임직원 218명
  • 증거금 81조 (코스피 역대 최대 청약 증거금)
    • 청약 참여건수 474만건
    • 공모주 '균등배분' 비례 + 균등배분
    • 증권사별 중복청약 가능
    • 우리사주 배정액 4500억 35% 미달
    • 인당 21억 ~ 30억 필요
    • 따상하면 33억 잭팟 -> 임직원 퇴사 각
  • 거품...
  1. ESG 경영
  • 환경, 사회, 지배구조

  • 비재무적 지표

  • 투자시 ESG 고려해야하나 ? 이미 고려중 -> 테슬라

  • 가치에 투자하는 시대 (환경적 가치, 사회적 가치)

  • 친환경

    • LG화학, 현대차, 삼성SDI, 기아, 현대모비스
  • 새로운 세대의 선택

    • 법제화, 규제
    • 10,20,30 미래에 투자 -> 환경문제 고려해야 한다.
    • 공정의 중요성 -> 데이터 투명화 중요
  • 3가지 변화

    • 기후, 디지털, 바이오
    • DT란 ? 단순한 전환이 아닌 IT가 업의 중심이 된 형태
  • 디지털

    • 삼성전자, SK하이닉스, NAVER, 카카오

· 2 min read
  1. 레버리지
  • Leverage (지렛대) 효과란: 차입한 돈을 지렛대 삼아 자기자본이익률을 높이는 것을 말한다.
  • 같은 이익을 올리더라도 내 자본을 적게 들이면 자본 대비 이익의 비율(자기자본이익률)은 올라간다.
  • 1000원을 투자해 100원의 순이익을 올리면 자기자본이익률(순이익/자기자본 * 100 )은 10%
  • 자기자본 500 + 차입금 500으로 순이익 100원을 올리면 자기자본이익률은(100/500 *100)은 20%
  • 차입금에 대한 이자부담이 기대수익률보다 작을 경우 돈을 빌려와 투자하는 것이 유리(반면 이자 부담도 크기 때문에 불황으로 수익이 줄어들면 도산 가능)
  • 레버리지가 높다는 말은 곧 차입금이 많다는 것을 의미
  • 레버리지 비율(전체 투자금액/내돈): 레버리지 비율이 높다는 것은 차입금이 높다는 의미
  1. 스프레드 거래
  • Spread (차이)
  • 스프레드거래란 두 개 이상의 선물계약을 반대 방향으로 설정하는 거래형태
  • 저평가된 선물을 매수하고 동시에 고평가된 선물을 매도함으로써 이익을 얻고자 하는 투기거래
  • 스프레드 거래의 종류
    • 동종 상품 간 거래:

· One min read
  1. 조세의 분류
  • 기준별 조세의 분류
    • 과세주체: 국세/지방세
    • 조세의 전가성: 직접세/간접세
    • 지출의 목정성: 보통세/목적세
    • 과세표준단위: 종가세/종량세
    • 세율의 구조: 비례세/누진세

· 2 min read
  1. MVC 패턴의 이해
  • MVC란 Model, View, Controller를 뜻하는 용어로 개발 형태의 일종

  • Model은 데이터 베이스와의 관계를 담당, 클라이언트의 요청에서 필요한 자료를 데이터베이스로부터 추출하거나, 수정하여 Controller로 전달

  • View는 사용자에게 보여지는 UI 화면, 주로 .jsp 파일로 작성하며, Controller에서 어떤 View 컴포넌트를 보여줄지 결정

  • Controller는 클라이언트의 요청을 받고, 적절한 Model에 지시를 내리며, Model에서 전달된 데이터를 적절한 View에 전달

  • Client -> Controller -> Model -> DB -> Model -> Controller -> View -> Client

  • Model 1

    • MVC에서 View와 COntroller가 같이 있는 형태
    • 클라이언트 -> JSP(View + Controller) -> DAO -> DataBase
  • Model 2

    • MVC에서 Model, View 그리고 Controller가 모두 모듈화 되어 있는 형태
    • 클라이언트 -> Servlet(Contorller) -> Command, DAO(Model) -> DataBase -> JSP(VIEW) -> 클라이언트
  • Controller, Model 주로 Java로 View는 JSP로 html, java

  1. 전체적인 컴포넌트 설계
  • 클라이언트 -> FrontController -> command -> DAO -> DTO - > DB -> UI 화면 -> 클라이언트

· 2 min read
  1. RequestDispatcher 클래스
  • Servlet 또는 JSP에서 요청을 받은 후 다른 컴포넌트로 요청을 위임 할 수 있다.
  • 이러한 위임 방법에는 2개의 클래스를 이용
  • RequestDispatcher, HttpServletResponse
  • RequestDispatcher 클래스의 경우 요청 받은 요청객체(request)를 위임받는 컴포넌트에 동일하게 전달 할 수 있다.
  • RequestDispatcher 클래스
    • 클라이언트 요청(request객체) -> 요청받은 컴포넌트 요청위임(request 객체) -> 위임받은 컴포넌트
  • dispatcher.jsp
   <%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
dispatcherJsp.jsp
<hr/>
id : <%= request.getAttribute("id") %> <br/>
pw : <%= request.getAttribute("pw") %>
</body>
</html>
  • RequestObj.java(servlet)
 private void actionDo(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("actionDo()");

request.setAttribute("id", "abcde");
request.setAttribute("pw", "12345");

RequestDispatcher dispatcher = request.getRequestDispatcher("/dispatcher.jsp");
dispatcher.forward(request, response);
}
  1. HttpServletResponse 클래스
  • 요청 받은 요청객체를 위임 받은 컴포넌트에 전달 하는 것이 아닌, 새로운 요청객체를 생성한다
  • HttpServletResponse 클래스
    • 클라이언트 요청 -> 요청받은 컴포넌트 <- 응답 클라이언트 요청 -> 위임받은 컴포넌트 <- 응답
    • request 객체가 달라진다
  • 이거 이해 안되어 다시 확인 필요!
  • 클라이언트 -> 요청 -> 요청컴포넌트 -> 응답 -> 클라이언트 -> 요청 -> 위임받은 컴포넌트 -> 응답

· 4 min read
  1. url-pattern
  • 디렉터리 패턴
    • 디렉터리 형태로 서버의 해당 컴포넌트를 찾아서 실행하는 구조
    • http://localhost:8181/exampleProject/Hello -> /Hello Servlet
    • 서블릿 이름으로 각각 찾아서 이동
  • 확장자 패턴
    • 확장자 형태로 서버의 해당 컴포넌트를 찾아서 실행하는 구조
    • http://localhost:8181/exampleProject/hello.do -> *.do Servlet
    • .do로 끝나는 요청들은 Servlet으로 가서 hello.do, world.do 각각의 요청에 따라 처리
  1. FrontController 패턴
  • 클라이언트의 다양한 요청을 한곳으로 집중시켜, 개발 및 유지보수에 효율성을 극대화 한다.

  • 요청_1 -> 요청 1 처리 서블릿 -> DAO 요청_2 -> 요청 2 처리 서블릿 -> DAO 요청_3 -> 요청 3 처리 서블릿 -> DAO

  • 요청 1 요청 2 -> 모든 요청을 처리하는 서블릿 -> DAO 요청 3

  1. Command Pattern
  • 클라이언트로부터 받은 요청들에 대해서, 서블릿이 작업을 직접 처리 하지 않고, 해당 클래스가 처리하도록 하는 패턴

  • 요청 1 요청 2 -> 모든 요청을 처리하는 서블릿 -> DAO 요청 3 interface

  • 요청 1 -> 요청1 처리 클래스 요청 2 -> 모든 요청을 직접 처리하지 않는 서블릿 -> 요청2 처리 클래스 -> DAO 요청 3 -> 요청3 처리 클래스

  • FrontController

    package userverify;
import java.io.IOException;
import java.io.PrintWriter;
import java.security.Timestamp;
import java.util.ArrayList;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
* Servlet implementation class FrontCon
*/
@WebServlet("*.do")
public class FrontCon extends HttpServlet {
private static final long serialVersionUID = 1L;

/**
* @see HttpServlet#HttpServlet()
*/
public FrontCon() {
super();
// TODO Auto-generated constructor stub
}

/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.getWriter().append("Served at: ").append(request.getContextPath());
actionDo(request, response);
}

/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
actionDo(request, response);
}

private void actionDo(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("actionDo()");

String uri = request.getRequestURI();
String conPath = request.getContextPath();
String command = uri.substring(conPath.length());

if(command.equals("/membersAll.do")) {
response.setContentType("text/html;charset=EUC-KR");
PrintWriter writer = response.getWriter();
writer.println("<html><head></head><body>");

Service service = new MembersAllService();
ArrayList<MemberDto> dtos = service.execute(request,response);

for(int i = 0; i< dtos.size(); i++) {
MemberDto dto = dtos.get(i);
String id = dto.getId();
String pw = dto.getPw();
String name = dto.getName();
String eMail = dto.geteMail();
java.sql.Timestamp rDate = dto.getrDate();
String address = dto.getAddress();

writer.println(id + "," + pw + ", " + name + ", " + eMail + ", " + rDate + ", " + address + "<hr/>");

}
writer.println("</body></head>");
}
}

}
  • Service Interface

package userverify;

import java.util.ArrayList;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public interface Service {
public ArrayList<MemberDto> execute(HttpServletRequest request, HttpServletResponse response);
}
  • MemebersAllService.java
    package userverify;

import java.util.ArrayList;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;



public class MembersAllService implements Service{

public MembersAllService() {

}

public ArrayList<MemberDto> execute(HttpServletRequest request, HttpServletResponse response) {
// TODO Auto-generated method stub

MemberDao dao = MemberDao.getInstance();
return dao.membersAll();

}
}

· 2 min read
  1. JSTL
  • JSP Standard Tag Library
  • JSP, HTML 태그가 혼용되어 가독성이 떨어짐, 이것을 보완하고자 나온 태그 라이브러리가 JSTL
  • Tomcat에 포함되어 있지 않아 별도 설치 필요
  • jakarta.apache.org
  1. JSTL 라이브러리
  • Core(prefix: c)
  • XML Processing(prefix: x)
  • l19N formatting(prefix: fmt)
    • 국제화 날짜 형식
  • SQL(prefix: sql)
  • Functions(prefix: fn)
  • Core 디테일
    • 출력 태그: <c:out>
      • <c:out value="출력값" default="기본값" escapeXml="true of false">
    • 변수 설정 태그: <c:set>
      • <c:set var="변수명" value="설정값" target="객체" property="값" scope="범위">
    • 변수를 제거하는 태그: <c:remove>
      • <c:remove var="변수명" scope="범위">
    • 예외 처리 태그: <c:catch>
      • <c:catch var="변수명">
    • 제어문(if) 태그: <c:if>
      • <c:if test="조건" var="조건 처리 변수명" scope="범위">
    • 제어문(switch) 태그: <c:choose>
      • <c:choose> <c:when test="조건"> 처리 내용 </c:when> <c:otherwise> 처리 내용 </c:otherwise> </c:choose>
    • 반복문(for) 태그: <c:forEach>
      • <c:forEach items="객체명" begin="시작 인덱스" end="끝 인덱스" step="증감식" var="변수명" varStatus="상태변수">
    • 페이지 이동 태그: <c:redirect>
      • <c:redirect url="url">
    • 파라미터 전달 태그: <c:param>
      • <c:param name="파라미터명" value="값">