연산을 줄이기 위해 리스트가 바뀌었는지 확인.

같으면 업데이트x

다르면 업데이트o

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

push pop 쓰지말것

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

 

새로

rcc 엔터

 

public의 index.html 에

  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js"></script>

넣고

 

App.js

import React, { Component } from "react";

class App extends Component {
  render() {
    return (
      <div>
        <nav className="navbar navbar-expand-md bg-dark navbar-dark">
          <a className="navbar-brand" href="#">
            Navbar
          </a>
          <button
            className="navbar-toggler"
            type="button"
            data-toggle="collapse"
            data-target="#collapsibleNavbar"
          >
            <span className="navbar-toggler-icon"></span>
          </button>
          <div className="collapse navbar-collapse" id="collapsibleNavbar">
            <ul className="navbar-nav">
              <li className="nav-item">
                <a className="nav-link" href="#">
                  Link
                </a>
              </li>
              <li className="nav-item">
                <a className="nav-link" href="#">
                  Link
                </a>
              </li>
              <li className="nav-item">
                <a className="nav-link" href="#">
                  Link
                </a>
              </li>
            </ul>
          </div>
        </nav>
        <br />
      </div>
    );
  }
}

export default App;

 

또는 nav를 컴포넌트 또는 함수형 컴포넌트로 만들어서 App.js에 집어넣자

 

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

Next.js 꼭 써보자

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

리액트는 하이퍼링크 (a태그)를 쓰지 못한다.

그래서 라우터를 사용해야한다.

 

SPA 싱글 페이지 애플리케이션

리액트는 싱글페이지이다.

아래 라이브러리를 사용하자.

 

 

yarn이 아니라면 npm사이트가서 설치법 확인

 

 

설명을 보려면 빨간박스

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

부트스트랩의 A링크도 다 Link to로 바꾸면 된다.

 

 

 

 

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

플래그와 부가 데이터

액티비티는 [액티비티 매니저] 라는 객체에 의해 [액티비티 스택]이라는 것으로 관리됨

액티비티를 차곡차곡 쌓아두고 상위에 있는 액티비티가 없어지면 이전의 액티비티가 화면에 보임

순서

액티비티 생성

매니페스트 파일 등록

startActivity() 또는 startActivityForResult() 메서드를 사용해 실행

새로운 액티비티가 화면에 띄워짐

이전 액티비티는 액티비티 스택에 저장

액티비티가 없어지면 스택 최상위에 있는 액티비티가 노출

(동일한 액티비티를 여러번실행하면 스택에 계속 쌓여 데이터를 여러번 접근하거나 리소스 문제 발생)

NO_FLAG

FLAG_ACTIVITY-SINGLE-TOP

FLAG_ACTIVITY-NO_HISTORY

FLAG_ACTIVITY-CLEAR_TOP

 

NO_FLAG 일 경우 같은 액티비티가 계속 해서 쌓인다

FLAG_ACTIVITY-SINGLE-TOP 일 경우 같은 액티비티는 하나만 쌓인다

 

새로운 액티비티를 띄워주는 액티비티를 부모 액티비티라고 할경우

전달하는 인텐트는 새로 만들어진 인텐트의 onCreate()메서드 안에서 getIntent()메서드로 참조 할 수있다

 

onNewIntent()메서드를 재정의 하면 액티비티가 새로 만들어지지 않았을 때 인텐트 객체만 전달 받을 수 있음

액티비티가 이미 메모리에 객체로 만들어져 있다면 액티비티를 다시 띄우더라도 onCreate()가 실행되지 않기 때문에

onNewIntent()를 재정의 해서 사용해야한다

 

브로드캐스트 수신자?

 

FLAG_ACTIVITY-NO_HISTORY

항상 맨처음의 액티비티가 보이게된다 알림 메시지등 한번화면에 보여줄 때 좋음

 

FLAG_ACTIVITY-CLEAR_TOP

는 되돌아갈 때 스택에 상위 액티비티를 다 제거하고 메인 액티비티로 가게됨

 

부가데이터 

Intent Bundle

번들 객체는 해시테이블과 유사

기본자료형을 넣고 뺄수 있지만 Serializable 객체도 사용가능

안드로이드는 객체를 전달할때 Serializable 보다 Parcelable인터페이스 권장

 

 

 

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

최종 프로젝트 화면  (0) 2020.07.29
안드로이드 // 200728 / UI쓰레드 /  (0) 2020.07.28
200724 실기 오답노트  (0) 2020.07.24
실기 오답노트 200722  (0) 2020.07.22
실기 오답노트 200721  (0) 2020.07.21

 

------

shared preferences

앱을꺼도 데이터를 남기고 싶을때 

shared preferences - 내부 하드디스크에 저장하는 기술

앱은 스스로의 shared preferences가 있다

이런 값을 public으로 저장했다면 다른앱에 데이터 공유할 수 있다

웹브라우저의 쿠키개념과 비슷하다

하지만 앱을 지우거나 휴대폰을 바꿀 때 사라지므로 DB에 데이터를 저장하는 것이 좋다

 

 

 

 

 

 

종료시 저장

 

 

시작시 가져오기

 

 

 

 

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

 

'App > Android' 카테고리의 다른 글

안드로이드 // intent / bundle  (0) 2020.07.28
안드로이드 // 버튼 클릭과 리스너  (0) 2020.07.28
안드로이드 // 생명주기  (0) 2020.07.27
안드로이드 // intent  (0) 2020.07.27
안드로이드 // 롬복 라이브러리 추가  (0) 2020.07.27

 

안드로이드 생명주기

 

책 277

 

ctrl + o

 

 

 

 

앱을 처음 켜면

 

 

 

 

 

 

앱을 다시 선택하면

 

 

앱을 끄면

 

체류시간은 onStart부터 onRestart까지로 잡으면됨

 

중요

시작! - onCreate

정지 - onPause

다시돌아올때 - onResume

종료할때 - onDestroy

 

더보기
package com.jaybon.lifecycleex01;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "Main_Activity";

    private String downloadData = ""; // 다운로드 데이터로 가정한다
    private String currentState = "";



    @Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG, "onStart: ");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.d(TAG, "onRestart: ");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d(TAG, "onStop: ");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d(TAG, "onPause: ");

        currentState = "에너지 50";
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG, "onResume: ");

        Log.d(TAG, "onResume: 현재 에너지는 "+currentState);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy: ");
    }

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

        // 다운로드 시작
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    for(int i=1; i<4; i++){
                        Thread.sleep(1000);
                        Log.d(TAG, "run: "+i+"초");
                    }
                    downloadData = "다운받은 데이터";
                    Log.d(TAG, "run:  다운로드 종료");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();

        Log.d(TAG, "onCreate: ");
    }
}

 

 

 

------

 

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

 

Intent

Intent를 간단히 생각하면

트럭이라고생각하면된다

출발지와 목적지를 알려주고 내용을 싣는다

번들객체 - 오브젝트를 싣는 곳

 

입력시  put을 사용한다

 

 

 

 

 

shift 따닥

바이트로 바꾼다! (직렬화)

 

 

 

 

 

 

메인액티비티

 

 

안드로이드 내부에서는 Bundle을 사용하면 된다

 

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

 

---------

(롬복파일 실행해서 고추)

 

 

롬복

 

 

저장소(리파지토리)추가

 

 

 

 

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

 

 

 

없어도 잘돌아 간다고함

 

 

깃에 커밋하면서 하자

만들어두자

 

 

디비 구조에 따라 모델을 만들어주자

 

 

 

 

jsp때 만든 ui를 가져다 사용하자

 

 

 

 

 

 

header.jsp로 가서 회원가입과 로그인 주소를 만들자

 

 

(스크립트)1번유저정보는 1번유저만 볼수 있다 - 로그인이 되어있어야한다 - 2가지가 필요 ( 인증 + 권한 )

1번유저정보 (인증 + 권한)
1번유저수정 (인증 + 권한)
1번유저삭제 (인증 + 권한)
-> /user/~~~~~~

2번 회원가입 페이지 이동, 회원가입시 ()
2번 로그인 페이지 이동 ()
-> /auth/~~~~~~

라이브러리를 사용할 때 이해하게 된다

 

 

 

 

DataSourceConfig.java 삭제

 

fail to refresh live data from process 에러가 뜰 경우

pom.xml에

		<!-- 스프링부트 스타터 액츄에이터 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-actuator</artifactId>
		</dependency>

을 추가해보자

 

 

 

 

SPA 싱글페이지 애플리케이션 내부적으로 ajax

 

웹브라우저 안드로이드 리액트 공용 서버를 만들려면

페이지가 아닌 데이터를 리턴받는 서버를 만들어야한다

 

get요청을 제외한 모든 요청을 데이터를 리턴하는 서버로 제작

 

 

 

 

 

 

자바스크립트를 줬으니 아이디를 주고 타입을 버튼으로 바꾸자

 

 

앞에 /를 붙여주면 static 으로 이동한다

 

 

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

디스 바인딩

 

화살표함수로 디스 바인딩

 

 

context-path 를 /로 해주자

포트도 8080

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

 

 

get방식 빼고는 자바스크립트 방식으로 통일

모든 요청은 자바스크립트 !

 

 

폼태그 내용을 지우자

 

 

폼 인풋에 name 을 적는 것은 옛날방식이다

 

 

 

 

자바스크립트 로직 추가

더보기
let index = { //여기서는 이벤트 리스너를 바인딩만 하고
	init : function() {
		
		$("#btn-save").on("click", ()=> {
			this.save();
		});
		
		$("#btn-update").on("click", ()=> {
			this.update();
		});
		
	},
	
	save: function() { // 실제 로직은 여기서 실행
		alert("btn-save 로직 실행");
		let data ={
				username : $("#username").val(),
				password : $("#password").val(),
				email : $("#email").val()
		};
		alert("btn-save data");
		
		$.ajax({ // 공식!
			
			type:"post",
			url: "/auth/joinProc",
			data: JSON.stringify(data),
			contentType: "application/json; charset=utf-8",  //http에서는 Content-Type 라고 씀
			dataType: "json"  // 스프링은 응답할때 스트링일 경우 무조건 json으로 응답한다
			
		}).done((resp)=>{
			console.log(resp);
		}).fail((error)=>{
			console.log(error);
		});
		
	},
	
	update: function() { // 실제 로직은 여기서 실행
		alert("btn-update 로직 실행");
	}
}

index.init();

 

 

 

 

 

 

 

 

 

 

이해하기위해서 이렇게 테스트해보자 (나중에는 response 엔티티를 사용)

 

 

 

 

#{   } 변수명만적으면 알아서 getter를 호출할 수 있다

 

 

redayState가 4면 잘 들어갔다는 뜻

 

 

 

 

select가 아닌 delete insert update를 사용할 때
ok가 아닌 엔티티를 하나 만들어서 항상 같은 값을 리턴해주자 

 

 

 

 

 

 

 

 

 

 

ResponseEntity<?> 를 사용해도된다 // 나중에 쓸 것

 

 

결과

 

 

 

 

try catch를 안만들어두면 ajax자체를 실패하여 fail로 가게된다
그렇게 처리해도 되지만 fail에서 처리하지않고 done에서 처리하려면 try catch를 사용해본다

나중에는 핸들러를 이용할 것이다

트라이캐치를 쓰면 오류를 찾기 어려워지기 때문에 로그를 남겨야한다
그렇기 때문에 쓰지않는 것이 좋다

 

 

 

 

우리는 에러가 터질 때 낚아 채서 처리할 것이다 

 

 

리턴을 보이드로

 

result 를 없애고

 

 

fail로 이동

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

 

 

login도 폼에서 메소드와 액션을 지우고 인풋의 name 속성을 지운다

 

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

컨텍스트 - 이벤트를 받을 수 있다

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

 

 

 

 

 

리파지토리

 

 

맵퍼

 

 

서비스

 

 

컨트롤러

 

 

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

마이바티스 설정들 나중에 공부! 확인

https://mybatis.org/mybatis-3/ko/index.html

 

MyBatis – 마이바티스 3 | 소개

마이바티스는 무엇인가? 마이바티스는 개발자가 지정한 SQL, 저장프로시저 그리고 몇가지 고급 매핑을 지원하는 퍼시스턴스 프레임워크이다. 마이바티스는 JDBC로 처리하는 상당부분의 코드와 ��

mybatis.org

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

 

 

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

퍼시스턴스란 rs를 자바 객체에 넣어 주는 것

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

 

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

 

 

 

 

 

 

 

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

 

ObjectUtils.isEmpty(persistUser)

널 또는 빈객체인지 확인

 

 

 

 

 

 

+ Recent posts