타입에 따라 기본 키보드가 달라지기 때문에 잘 맟추어서 설정하는 것이 좋다

 

 

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

(나중에)

 

 

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

 

 

 

 

 

 

 

 

웹뷰 - 앱안의 웹 브라우저라고 생각하면 된다

 

 

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

자바코드로만 앱을 만들면 [네이티브 앱]

반응형 웹으로 앱을 만들면 [웹앱]

웹뷰를 이용해서 웹을 보이도록 만들면 [하이브리드 앱]

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

 

 

프로그래스바 //별점

 

 

사진이나 영상을 올릴 때 사용

 

 

spinner - flash메시지?

 

 

 

 

 

 

저기들어가면 라이브러리를 어떻게 사용하는지 나옴

 

 

 

 

 

 

 

 

책 189페이지

drawable 상태드로어블 만들어보기

 

 

 

 

 

눌렸을시 꽉찬 하트모양

 

 

버튼 배경에 드로어블설정

 

 

 

 

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

 

 

 

xml 규칙 변수명 언더바

 

 

모서리가 둥근버튼

 

 

드로어블

soild 버튼 안의 색깔

stroke 버튼 테두리 색깔

corners 모서리 둥글기

 

 

더보기
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <LinearLayout
        android:paddingTop="80dp"
        android:paddingLeft="25dp"
        android:paddingRight="25dp"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">


        <ImageView
            android:id="@+id/iv_logo"
            android:layout_width="match_parent"
            android:layout_height="155dp"
            android:layout_marginBottom="10dp"
            app:srcCompat="@drawable/instagram_logo" />

        <com.google.android.material.textfield.TextInputLayout
            android:id="@+id/tf_email"
            android:layout_marginTop="8dp"
            android:layout_marginBottom="8dp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="Email">

            <com.google.android.material.textfield.TextInputEditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:inputType="textEmailAddress"
                />

        </com.google.android.material.textfield.TextInputLayout>

        <com.google.android.material.textfield.TextInputLayout
            android:id="@+id/tf_password"
            android:layout_marginTop="8dp"
            android:layout_marginBottom="8dp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="Password">

            <com.google.android.material.textfield.TextInputEditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:inputType="textPassword"
                />

        </com.google.android.material.textfield.TextInputLayout>

        <androidx.appcompat.widget.AppCompatButton
            android:layout_width="match_parent"
            android:layout_height="60dp"
            android:layout_marginTop="10dp"
            android:background="@drawable/white_rounded_button"
            android:text="Login" />


    </LinearLayout>

</RelativeLayout>

 

 

 

 

 

 

 

 

 

 

 

 

다른 것은 그대로 메인만 언더바 주자(검색 용이)

 

 

 

 

 

 

 

 

메인쓰레드는 UI 쓰레드와 이벤트 분배 쓰레드를 호출하고 죽는다

UI 쓰레드 - 

이벤트 분배 쓰레드 - 버튼 클릭 등 할 때 UI 쓰레드에 콜백

 

다운로드시에도 UI쓰레드는 그림을 그려야 하기 때문에 새로운 쓰레드로 다운로드 해야한다

 

 

더보기
package com.jaybon.myapplication;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ProgressBar;

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "Main_Activity"; // 다른 것은 그대로 메인만 언더바 주자(검색 용이)
    // 제일 위에 전역으로 적는 것은~
    // 컴포넌트들을 모두 전역으로 올려서 선언한다

    private ProgressBar pgbDownload;

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

        initComponent(); // 컴포넌트 초기화 (개발자 임의 작명)

        imageDownload();

        Log.d(TAG, "onCreate: 테스트1");
    }

    private void  initComponent(){ // 여기서 컴포넌트들을 찾아주고 프로그래밍 한다

        pgbDownload = findViewById(R.id.pgb_download);
        // 화면에 그리지 않으면 연산을 하지 않는다
    }

    private void imageDownload(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                Log.d(TAG, "run: 다운로드 쓰레드 시작");
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                Log.d(TAG, "run: 다운로드 쓰레드 종료");
                pgbDownload.setVisibility(View.INVISIBLE);
            }
        }).start();
    }



}

 

 

 

 

setOn이 안드로이드의 리스너 추가 함수이다

 

 

레벨8 설치햐야 람다식을 사용할 수 있다

 

 

숫자 증감

더보기
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/tv_count"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="0"
        android:textSize="36sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.329" />

    <Button
        android:id="@+id/btn_add"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="증가"
        app:layout_constraintBottom_toTopOf="@+id/guideline"
        app:layout_constraintEnd_toStartOf="@+id/btn_minus"
        app:layout_constraintHorizontal_bias="0.477"
        app:layout_constraintStart_toStartOf="parent" />

    <Button
        android:id="@+id/btn_minus"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="68dp"
        android:text="감소"
        app:layout_constraintBottom_toTopOf="@+id/guideline"
        app:layout_constraintEnd_toEndOf="parent" />

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/guideline"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_end="248dp" />

</androidx.constraintlayout.widget.ConstraintLayout>

 

 

더보기
package com.jaybon.countingapp;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "Main_Activity";
    private Button btnAdd, btnMinus;
    private TextView tvCount;
    private int count = 0;

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

        tvCount = findViewById(R.id.tv_count);
        tvCount.setText(count+"");

        btnAdd = findViewById(R.id.btn_add);
        btnMinus = findViewById(R.id.btn_minus);

        btnAdd.setOnClickListener((View view)->{
            count++;
            tvCount.setText(count+"");
        });

        btnMinus.setOnClickListener((View view)->{
            if(count > 0){
                count--;
                tvCount.setText(count+"");
            }
        });

//        btnAdd.setOnClickListener(new View.OnClickListener() {
//            @Override
//            public void onClick(View view) {
//                count++;
//                tvCount.setText(count);
//            }
//        });
//
//        btnMinus.setOnClickListener(new View.OnClickListener() {
//            @Override
//            public void onClick(View view) {
//                count--;
//                tvCount.setText(count);
//            }
//        });

    }

}

 

 

 

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

 

모든 객체(버튼이나 라디오 박스 등)는 View 를 상속받는다 (View의 자식 )

View는 context를 가지고 있고 context는 OS가 보내준다

 

Button btnTemp = (Button)view; // 버튼의 context를 가져올 수 있다 

 

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

계산기 만들기

eval 함수(자바스크립트)

안드로이드에서 자바스크립트 함수를 땡겨 올 수 있다

 

https://github.com/APISENSE/rhino-android

 

APISENSE/rhino-android

Give access to RhinoScriptEngine from the JSR223 interfaces on Android JRE. - APISENSE/rhino-android

github.com

 

build.gradle

더보기
apply plugin: 'com.android.application'

android {
    compileSdkVersion 29
    buildToolsVersion "30.0.0"

    defaultConfig {
        applicationId "com.jaybon.countingapp"
        minSdkVersion 21
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {
    implementation fileTree(dir: "libs", include: ["*.jar"])
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'

    implementation 'io.apisense:rhino-android:1.0'

}

 

activity_main.xml

더보기
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <!--    <LinearLayout-->
    <!--        android:layout_width="wrap_content"-->
    <!--        android:layout_height="wrap_content">-->


    <!--    </LinearLayout>-->


    <EditText
        android:id="@+id/pt_result"
        android:layout_width="358dp"
        android:layout_height="62dp"
        android:layout_marginBottom="40dp"
        android:ems="10"
        android:inputType="textPersonName"
        android:text=""
        android:textSize="30sp"
        app:layout_constraintBottom_toTopOf="@+id/tableLayout"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

    <TableLayout
        android:id="@+id/tableLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="20dp"
        android:orientation="vertical"
        android:stretchColumns="0, 1, 2"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <TableRow>

            <Button
                android:id="@+id/num1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="1" />

            <Button
                android:id="@+id/num2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="2" />

            <Button
                android:id="@+id/num3"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="3" />

            <Button
                android:id="@+id/btn_add"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="+" />

        </TableRow>

        <TableRow>

            <Button
                android:id="@+id/num4"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="4" />

            <Button
                android:id="@+id/num5"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="5" />

            <Button
                android:id="@+id/num6"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="6" />

            <Button
                android:id="@+id/btn_minus"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="-" />

        </TableRow>

        <TableRow>

            <Button
                android:id="@+id/num7"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="7" />

            <Button
                android:id="@+id/num8"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="8" />

            <Button
                android:id="@+id/num9"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="9" />

            <Button
                android:id="@+id/btn_multi"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="*" />

        </TableRow>

        <TableRow>

            <Button
                android:id="@+id/num0"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="0" />

            <Button
                android:id="@+id/btn_clear"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="C" />

            <Button
                android:id="@+id/btn_devide"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="/" />

            <Button
                android:id="@+id/btn_cal"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="=" />

        </TableRow>


    </TableLayout>


</androidx.constraintlayout.widget.ConstraintLayout>

 

eval.java

더보기
package com.jaybon.countingapp;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class eval {
    public static String cal (String result) throws ScriptException {
        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("js");
        try {
            return engine.eval(result).toString();
        }catch(Exception e) {
            e.getStackTrace();
        }
        return null;
    }
}

 

MainActivity.java

더보기
package com.jaybon.countingapp;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import javax.script.ScriptException;


public class MainActivity extends AppCompatActivity {

    private static final String TAG = "Main_Activity";

    private EditText ptResult;
    private Button btn[] = new Button[16];
    private int i;


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

        init();
        initListener();



//        btnAdd.setOnClickListener((View view)->{
//
//            Log.d(TAG, "onCreate: btnAdd:"+view.getId());
//
//            count++;
//            tvCount.setText(count+"");
//        });
//
//        btnMinus.setOnClickListener((View view)->{
//            if(count > 0){
//                count--;
//                tvCount.setText(count+"");
//            }
//        });
    }

    private void init(){
        btn[0] = findViewById(R.id.num0);
        btn[1] = findViewById(R.id.num1);
        btn[2] = findViewById(R.id.num2);
        btn[3] = findViewById(R.id.num3);
        btn[4] = findViewById(R.id.num4);
        btn[5] = findViewById(R.id.num5);
        btn[6] = findViewById(R.id.num6);
        btn[7] = findViewById(R.id.num7);
        btn[8] = findViewById(R.id.num8);
        btn[9] = findViewById(R.id.num9);
        btn[10] = findViewById(R.id.btn_add);
        btn[11] = findViewById(R.id.btn_minus);
        btn[12] = findViewById(R.id.btn_multi);
        btn[13] = findViewById(R.id.btn_devide);
        btn[14] = findViewById(R.id.btn_clear);
        btn[15] = findViewById(R.id.btn_cal);
        ptResult = findViewById(R.id.pt_result);
    }

    private void initListener(){

        for (i=0; i<14; i++){
            btn[i].setOnClickListener((View view)->{
                Button btn = (Button)view;
                ptResult.append(btn.getText().toString());
            });
        }

        btn[14].setOnClickListener((View view)->{
            ptResult.setText("");
        });

        btn[15].setOnClickListener((View view)->{
            String result = ptResult.getText().toString();
            try {
                ptResult.setText(eval.cal(result));
            } catch (ScriptException e) {
                e.printStackTrace();
            }
        });

    }

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

// ViewResolver -> @ResponseBody이 있다면 문자열을 전송한다 / @ResponseBody이 없다면 파일명을 찾아서 전송한다

 

 

 

 

 

jsp 같은 것을 템플릿 엔진이라고 한다

부트진영에서 jsp를 버렸음 (하지만 아직까지 회사에서 jsp를 사용한다)

최근에 가장 핫한 것은 Mustache

 

 

 

 

 

 

 

 

여기에 템플릿 엔진 파일을 넣으면 부트가 자동으로 찾는다

 

서픽스 프리픽스
확장자 적으면 안된다
뷰리졸버가 찾는 주소

 

이클립스에서는 기본적으로 mustache를 지원하지 않는다

 

 

 

html로 만들어보자

 

 

 

 

html로 만들었기 때문에 자동완성이 된다

 

 

 

타임리프- 태그에 모든 문법을 넣어서 처리 (th:text=${object.value})

타임리프 그루비 등은 문법이 많아서 템플레이트에서 코딩하게 된다
(너무 많은 것을 지원해주기 때문에 자연스레 그렇게 된다)
그렇게 되면 협업시 불편해진다
템플레이트는 뿌리는 용도로만 사용하는 것이 서로 편하다

 

 

mustache는 문법이 적어서 뿌리는 용도로만 쓸 수 있다 (배우기도 쉬움)

 

 

 

 

 

 

DI  autowired 를 편하게 하는 방법이 파라미터에 적는 것이다

 

 

 

 

 

 

 

 

 

 

 

-----------

 

 

----------

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

헤더 푸터 추가하기

 

 

 

 

 

 

 

 

 

 

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

 

적어놓기만 하면 자동으로 설정됨

스프링에서는 권장하나

쓰기에 좋기 않기 때문에

yml파일로 바꾼다 (JSON이 변형된 것이라고 생각하면 됨, 중괄호와 쌍따옴표 뺌)

properties파일과 똑같은데 가독성이 좋다

server: 

 

무조건 자동완성

 

 

탭을 쓰면 안된다

 

 

 

 

아마존에 배포할 때 포트는 80포트 jar파일로 패키징

 

 

 

 

 

스프링레거시에서는 jsp파일에 접근하는 것을 원천봉쇄하기 위해 web-inf 폴더에 넣는다
(mvc 모델1은 사용하지 못한다는 뜻)
(컨트롤러 통해서 가는 것이 mvc 모델2)

 

스프링 부트는 jsp를 지원하지 않고 web-inf를 사용하지 않는다 (templates를 사용)
그래서 yml파일에서 프리픽스 서픽스를 설정

 

 

 

무조건 embed 써야함

 

 

 

 

디폴트 경로 - src/main/webapp/(프리픽스)/return명(서픽스)

 

 

 

 

이제 jsp를 만들 수 있다

 

 

 

 

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

안되면

서버끄고
project- clean
maven - update project
서버다시켜기

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

 

 

 

버퍼로 쿼리문을 날리기 위함

 

 

1. xml로 데이터베이스연결

2.yml로 데이터베이스연결

3.자바파일로 데이터베이스 연결

3개다 가능하다

 

pom.xml 에 추가하는 방식

 

 

자바에서 dataSource 객체 -> 데이터 풀링 기법

 

 

https://khj93.tistory.com/entry/MyBatis-MyBatis%EB%9E%80-%EA%B0%9C%EB%85%90-%EB%B0%8F-%ED%95%B5%EC%8B%AC-%EC%A0%95%EB%A6%AC

 

[MyBatis] MyBatis란? 개념 및 데이터구조

MyBatis란? 객체 지향 언어인 자바의 관계형 데이터베이스 프로그래밍을 좀 더 쉽게 할 수 있게 도와 주는 개발 프레임 워크로서 JDBC를 통해 데이터베이스에 엑세스하는 작업을 캡슐화하고 일반 S

khj93.tistory.com

 

 

미리 프로젝트 생성시 적용해도 된다

 

 

starter 는 스프링부트라고 생각하면 된다

 

 

다른 것들과 다르게 버전을 넣어야 한다

 

 

사용하는 이유

퍼시스턴스 (자바 오브젝트로 매핑)

Select 해서 받아오는 데이터를 rs를 자바오브젝트로 쉽게 변환

 

 

 

 

문서 확인

https://mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/

 

mybatis-spring-boot-autoconfigure – Introduction

Introduction What is MyBatis-Spring-Boot-Starter? The MyBatis-Spring-Boot-Starter help you build quickly MyBatis applications on top of the Spring Boot. By using this module you will achieve: Build standalone applications Reduce the boilerplate to almost z

mybatis.org

 

 

 autowired를 사용하지않고 매개변수에 넣으면

스프링부트가 자동으로 해당 객체를 찾아서 띄운다 (없으면 오류)

 

 

https://github.com/codingspecialist/Springboot-MyBatis-Blog-V3/tree/master/src/main/java/com/cos/blog/config

 

codingspecialist/Springboot-MyBatis-Blog-V3

Contribute to codingspecialist/Springboot-MyBatis-Blog-V3 development by creating an account on GitHub.

github.com

 

 

 

 

Member 객체로 자동으로 담아주는 역할

 

 

인터페이스로 만들기

 

 

 

 

datasource가 동시접속시 순차적 처리를 한다

메모리에 띄울때 @Bean이라는 어노테이션이 있으면 리턴값을 IOC로 등록해준다
(스프링 컨텍스트에 싱글톤 패턴으로 담아간다)

 

*.xml 이라고 쓴 이유는 여러테이블(객체)가 있을 수 있기 때문

 

 

 

 

 

https://github.com/codingspecialist/Springboot-MyBatis-Blog-V3

 

codingspecialist/Springboot-MyBatis-Blog-V3

Contribute to codingspecialist/Springboot-MyBatis-Blog-V3 development by creating an account on GitHub.

github.com

 

 

create user 'spring'@'%' identified by 'bitc5600';
GRANT ALL PRIVILEGES ON *.* TO 'spring'@'%';
create database spring;
use spring;
CREATE TABLE user(
	id int auto_increment primary key,
    username varchar(100) unique not null,
    password varchar(100) not null,
    email varchar(100),
    profile varchar(200),
    createDate timestamp
) engine=InnoDB default charset=utf8;
CREATE TABLE post(
	id int auto_increment primary key,
    title varchar(100) not null,
    content longtext,
    userId int,
    createDate timestamp,
    foreign key (userId) references user (id) on delete set null
) engine=InnoDB default charset=utf8;
CREATE TABLE comment(
	id int auto_increment primary key,
    userId int,
    postId int,
    content varchar(300) not null,
    createDate timestamp,
    foreign key (userId) references user (id) on delete set null,
    foreign key (postId) references post (id) on delete cascade
) engine=InnoDB default charset=utf8;

 

 

설정을 자바파일로 만들어져야한다 
스프링부트에서는 yml에서 설정해놓으면 자동적으로 자바코드로 변환된다

 

                         <-object                  <-rs

Controller - reopsitory - SQLSession                   - DataSource - DB(MySQL)
                                SQLSessionFactory가 SQLSession을 만든다
                                DataSource+매퍼파일등록(repository라는 클래스와 연결되어 있음)

SQLSession은 CRUD 함수를 가지고 있다

SQLSession은 데이터베이스에 연결 할 수 있는 유일한 객체

 

 

 

 

CREATE TABLE member(
	id int auto_increment primary key,
    username varchar(100) not null,
    phone longtext
) engine=InnoDB default charset=utf8;

 

 

 

 

 

 

----

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

src 경로에 javalab이라는 폴더를 만든다

 

 

 

 

내 홈에서 src 가기

 

 

mv는 파일 이동

폴더 뒤에 슬래시 파일명을 다르게 적으면 다른파일명으로 저장된다

 

 

파일을 생성

 

 

파일이 들고 있는 데이터를 모니터에 출력

 

파일삭제

rm = 삭제

 

 

rm을 그냥 쓰면 디렉토리가 삭제 되지 않는다

 

 

-r은 디렉토리와 그 내용을 모두 삭제

 

 

기능을 알려면 help를 사용

 

 

파일찾기 명령어

명령어 찾기

 

 

초록색은 실제 실행파일

 

 

 

 

 

 

whereis 는 잘 안쓴다 대신 find를 사용함

 

 

 

 

 

 

 

 

 

 

 

 

Components

Nav.js

LoginBox.js

JoinBox.js

Article.js

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

 

page

Join.js

list.js

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

join.js 에는

import Nav / Footer / LoginBox

function abc(){
         return (
              <div>
                  <Nav></Nav>
                  <LoginBox></LoginBox>
                  <Footer></Footer>
              </div>
          )
}

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

 

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

styled-components-snippets 리액트 자동완성  (0) 2020.07.14
props 개념  (0) 2020.07.14
플렉스 기초  (0) 2020.07.09
리액트 화면 출력 개념  (0) 2020.07.08
리액트 컨셉 개념  (0) 2020.07.06

 

1. 스프링 부트 + MyBatis(쿼리 매핑) + MySQL

 

2. 스프링 레거시  + MyBatis+ MySQL 
CRUD

 

3. 스프링 부트 + JPA + MySQL
(가장 최신트렌드)

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

 

그래들, 메이븐 - 라이브러리 관리 도구, 버전 관리 도구, 의존성 관리 도구

자바코드와 라이브러리를 패킹 할 수 있다

- 주의점 : 많은 의존 라이브러리를 받게되면 파일이 깨지거나 문제가 발생 할 수 있다. -> 다시 다운로드

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

 

 

 

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

Spring Boot DevTools -> 저장만하면 리로딩 해줌

 

원하는 SQL체크

 

 

 

템플릿이란 JSP같은 것인데 스프링에서는 JSP를 버리는 것을 권장 (우리는 JSP로 작업)

 

 

 

디펜던시를 지우고 저장하면 

 

자동으로 삭제 및 추가를 한다

 

해당 코드를 pom.xml 에 넣으면 메이븐이 알아서 의존 라이브러리들도 설치해준다

 

 

메이븐이 관리하는 라이브러리 저장소

 

예를들어 롬복 라이브러리라면 위와 같은 경로

 

메이븐에서 다운받을때 잘못된 경우 해결법

1. 위 폴더를 삭제하고 다시 프로젝트를 다시 실행하면 된다

또는 못받은 라이브러리만 삭제하고 다시 실행

 

 

2. 프로젝트를  업데이트한다

 

 

JSP 프로젝트에서는 서블릿을 만들었는데 여기서는 자바파일로 만든뒤 어노테이션을 추가한다

 

컨트롤러 어노테이션

 

대표적 어노테이션

@Controller

@Service

@Repository

@Config

@Component - 특별한 목적이 없는 녀석들

프로젝트 시작시 이러한 어노테이션이 적혀있다면 메모리에 띄운다

 

 

 

 

 

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

 

다른 패키지에 만든 컴포넌트는 뜨지 않는다

com.cos.demo 이하만 스캔

등록

다른 패키지에 만든 건 메모리에 뜨지 않는다

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

외부로 노출 되는 것은 컨트롤러 밖에 없다

@Controller 

 

@Component 등은 노출되지 않는다

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

제어의 역전

Inversion of Controll

IoC - 어노테이션 한 클래스를 메모리에 등록

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

DI - Dependency Injection 의존성 주입

 

핵심!!!

타입을 통해서 주입받는다. 타입을 잘 적어야함

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

다른 패키지에 만든 컴포넌트는 불러와지 않는다

 

 

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

스프링 레거시에서는 컴포넌트 스캔을 servlet-context.xml 파일에 등록해줘야 한다

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

 

 

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

컨트롤러 함수이름은 크게 중요하지 않다

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

 

new를 하기 위해서는 @Component를 사용하지 말아야 한다

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

 

 

data로 보내도 객체 내부의 변수명에 맟춰서 자동으로 입력된다

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

 

접속 주소가 같아도 받는 방식을 다르게 할 수 있다

 

postman

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

 

 

 

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

 

함수 널처리나 전처리(파싱 등)

jsp에서는 if (requset.getparamater("aa") != null){}

스프링에서는

함수에 들어가기전이나 후에 널처리를 할 수 있다 = AOP

 

jackson 바인더 - 제이슨 파싱

아래 조건에서 발동

발동시기 - 함수 시작 직전

 

 

 

보내는 값을 하나 빼도 알아서 있는 값만 파싱해준다

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

 

post데이터는 기본적으로 key : value 형식

객체에 담기 위해서는 setter가 필요하다

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

 

MessageConverter 스프링으로 오는 데이터를 컨버팅해준다

기본은 form데이터 , @RequestBody 를 사용하면 json데이터 컨버팅 가능

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

 

 

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

 

스프링 할 때는 통신시 JSON으로 통일 하는 것이 좋다

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

 

스트링 타입으로 전송하고 싶다면

 

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

 

@RestController

컨트롤러를 타는 모든 주소가 리턴해주는게 모두 데이터일 경우 사용

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

 

 

+ Recent posts