전체 글 202

선택 정렬(Selection sort)

선택 정렬(Selection sort) 선택 정렬은 자리를 선택한 다음, 거기에 맞는 원소를 찾아서 위치시킨다. 오름차순 정렬을 한다고 해보자. 첫 번째 자리엔 가장 작은 원소가 있어야 한다. 선택 정렬은 첫 번째 자리를 '선택'한 다음 원소 리스트를 순회하며 가장 작은 값을 찾아서 첫 번째 자리에 데려다놓는다. 그 다음 두 번째 자리를 선택하고 두 번째로 작은 원소를 찾는다. 이 작업을 원소 리스트의 크기 만큼 반복하는 것이 선택 정렬이다. 말하자면 선택한 장소에 마땅히 있어야 할 원소를 찾아서 제자리로 돌려보내는 것이다. 최소값을 찾는다. 그 값을 맨 처음 위치한 값과 바꾼다. 제자리를 찾은 원소를 빼고 1, 2번을 반복한다. 선택 정렬은 원소 리스트를 한 번 순회할 때 하나의 원소만 ..

알고리즘 2020.12.29

거품 정렬(Bubble Sort)

Github : https://github.com/cocodori/study/tree/main/java-algorithm/algorithm01/sort-algorithm/src/main/java/sorting 정렬 알고리즘(Sorting algorithm) 컴퓨터 과학에서 정렬 알고리즘이란 원소를 어떤 기준으로 정렬하는 것을 말한다. 기준은 알파벳, 날짜, 숫자 등 무엇이든 될 수 있다. 탐색이나 병합 알고리즘 같은 경우 정렬된 리스트여야만 바르게 동작한다. 정렬 알고리즘은 다른 알고리즘의 전제 조건이 되므로 반드시 알아두어야 한다. 거품 정렬(Bubble Sort) 거품 정렬은 가까운 두 원소를 비교하여 정렬하는 알고리즘이다. 원소가 자리를 찾아가며 이동하는 모습이 거품이 수면으로 올라오는 듯한 모습을..

알고리즘 2020.12.29

다이나믹 디스패치, 더블 디스패치

Static Dispatch public class Dispatch { static class Service { void run() { System.out.println("run().."); } } public static void main(String[] args) { new Service().run(); } } 이런 코드가 있다고 하자. 이 코드는 컴파일 시점에 Service클래스의 run메소드가 실행된다는 것을 이미 알고 있다. 컴파일된 바이트 코드에서도 그 정보를 확인할 수 있다. 이처럼 컴파일 시점에 이미 어느 클래스의 어느 메소드를 사용할지가 결정되는 것을 static dispatch라고 한다. 그럼 run()메소드가 오버로딩 되어 여러 개 존재하는 경우를 보자. public class Dis..

Java 2020.12.26

6주차 - 상속

상속(Inheritance) 상속. 상속에 대해 생각해보자. 먼 미래에 내가 누군가에게 무언가를 상속하게 된다고. 난 무엇을 상속해줄 수 있을까? 돈? 집? 거기까진 모르겠다. 아마 운이 좋다면 키보드 정도를 남기고 떠날 수도 있을 것 같다. 아무튼. 자바에서는 extends키워드를 이용하여 상속을 사용한다. extends라는 단어에서 알 수 있듯이 자바에서 상속은 곧 확장이다. 슈퍼 클래스가 가진 것들을 이용하여 더 큰 클래스를 만들 목적으로 상속을 사용한다. 상속은 클래스와 클래스 간에 이루어진다. 확장(extends)되어질 클래스를 슈퍼클래스, 상위클래스(또는 부모 클래스)라고 하고 확장하는 클래스를 서브클래스, 하위클래스(또는 자식 클래스)라고 한다. 현실세계는 이 사람 저 사람에게 상속 받을 수..

Java 2020.12.25

5주차 - 클래스, 생성자, 객체, this, 메소드

Class class public class { //클래스의 기본 형태 } 클래스에서 사용할 수 있는 접근 제어자 일반적으로 사용하는 클래스의 접근제어자는 public이고 원한다면 default제어자를 사용할 수 있다. 그외 protected나 private은 클래스 앞에 선언할 수 없다. default 는 가능한데 protected는 사용할 수 없게 제한하는 이유가 무엇인지는 잘 모르겠다. 반면에 private을 클래스의 접근제어자로 사용할 수 없는 이유는 분명해 보인다. 객체 지향 세계에서는 "어떤 객체도 섬이 아니다" 객체지향이란 결국 객체들끼리 협업을 하는 것이다. private을 붙여서 클래스를 만든다는 것은 객체를 지향하지 않고 객체를 섬으로 만들겠다는 거나 다름 없다. final class ..

Java 2020.12.19

추상화에 대한 잡생각

"추상화 어떤 양상, 세바 사항, 구조를 좀 더 명확하게 이해하기 위해 특정 절차나 물체를 의도적으로 생략하거나 감춤으로써 복잡도를 극복하는 방법이다. 복잡성을 다루기 위해 추상하는 두 차원에서 이뤄진다. - 첫 번째 차원은 구체적인 사물들 간 공통점은 취하고 차이점은 버리는 일반화를 통해 단순하게 만드는 것이다. - 두 번째 차원은 중요한 부분을 강조하기 위해 불필요한 세부 사항을 제거함으로써 단순하게 만드는 것이다. 모든 경우에 추상화의 목적은 복잡성을 이해하기 쉬운 수준으로 단순화하는 것이라는 점을 기억하라." 객체지향의 사실과 오해 77p "객체를 결정하는 것은 행동이다. 데이터는 단지 행동을 따를 뿐이다. 이것이 객체를 객체답게 만드는 가장 핵심적인 원칙이다." 객체지향의 사실과 오해 95p "..

카테고리 없음 2020.12.16

4주차 - 제어문

https://github.com/whiteship/live-study/issues/4 제어문 제어문이란 말 그대로 코드를 '제어'해야 할 때 쓴다. 이를테면 어떤 조건(if-else/switch)에 따라 다르게 동작해야 할 때라든가, 같은 코드를 반복(loop)해야 할 때 쓰는 문(statement)을 제어문이라고 한다. 조건문(if-else) if-else문의 기본 문법 if(조건식) { //조건에 맞을 때 수행할 문장 } else { //조건에 맞지 않을 경우 수행할 문장(생략 가능) } 조건식의 결과는 반드시 boolean타입(true/false)이어야 한다. if - else if문 if의 조건식이 맞지 않을 때 다른 조건식을 충족하는지 확인할 때 사용하는 것이 else if절이다..

Java 2020.12.11

프로그래머스 - 모의고사

모의고사 문제 설명 수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다. 1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ... 2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, ... 3번 수포자가 찍는 방식: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, ... 1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열 answers가 주어졌을 때, 가장 많은 문제를 맞힌 사람이 누구인지 배열에 담아 return 하도록 solution ..

알고리즘 2020.11.26

JPA 연관관계 매핑

다양한 연관관계 매핑 연관관계 매핑할 때 고려해야 할 세 가지가 있다. 다중성 먼저 연관이 있는 두 테이블의 관계를 파악해야 한다. 1:1관계인지 1:N관계인지, 다중성을 고려해야 한다. 방향 두 엔티티 중 한쪽만 참조하는 단방향인지, 양쪽 모두 참조하는 양방향인지 고려해야 한다. 연관관계 주인 단방향 관계라면 관계를 설정하는 쪽이 주인이 된다. 하지만 양방향이라면 관계의 주인을 정해야 한다. 보통 '다(N)'가 되는 쪽이 외래 키를 가지고 있기 때문에 연관관계의 주인이 된다. 다중성 연관관계가 가진 다중성 다대일(N:1) @ManyToOne 일대다(1:N) @OneToMany 일대일(1:1) OneToOne 다대다(N:N)@ManyToMany 다중성을 판단하기 어려울 때는 반대방향을 생각하면 된다. 일..

JPA 2020.11.14

자바 람다식(Java Lamda Expression)

github 람다식(LamdaExpression) 람다식은 익명 클래스와 동등한 기능을 하는 식(Expression)이다. 간단한 식만으로 익명 클래스의 거추장스러움을 벗어날 수 있다. 익명 클래스 new Object() { public void print(String msg) { System.out.println(msg); } } 람다식 msg -> System.out.println(msg);위 코드는 람다를 보여주기 위한 간단한 예시일 뿐, 실제로 저 print()를 호출할 수는 없다. 요점은 람다식을 이용하면 훨씬 간결해진다는 것이다. 람다식을 사용하기 위해서는 람다식과 동등한 추상메서드가 선언된 인터페이스가 필요하다. 여기서 '동등하다'는 것은 추상메서드와 람다식의 매개변수와 반환타..

Java 2020.10.29

배열에서 두 개 뽑아서 더하기

programmers.co.kr/learn/courses/30/lessons/68644 코딩테스트 연습 - 두 개 뽑아서 더하기 정수 배열 numbers가 주어집니다. numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수를 배열에 오름차순으로 담아 return 하도록 solution 함수를 완성해주세요. 제한� programmers.co.kr 직접 푼 코드 import java.util.*; class Solution { /** * 정수 배열 numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑은 다음, * 더해서 만들 수 있는 모든 수를 배열에 오름차순으로 담아 return한다. * * Logic * 배열의 0번 인덱스부터 마지막 인덱스까지 반복하면서 * ..

알고리즘 2020.10.21

운영체제1

운영체제 Operating System 역할 1: 시스템 자원 관리자 Operating System 또는 OS라고 부른다. 시스템 자원(System Resource) = 컴퓨터 하드웨어 CPU, Memory I/O Devices(입출력 장치) 모니터, 마우스, 키보드, 네트워크 저장매체 : SSD, HDD 컴퓨터 하드웨어는 스스로 할 수 있는 일이 없다. 1. CPU : 각 프로그램이 얼마나 CPU를 사용할지 결정할 수 없다. 2. Memory : 각 프로그램이 어느 주소에 저장되어야 하는지, 어느 정도의 메모리 공간을 확보해야 하는지 메모리 자체가 결정할 수 없다. 3.저장매체(HDD, SSD) : 저장 매체 자체는 어디에 어떻게 저장할 지 결정할 수 없다. 4.I/O Devices : 마우스 자체가 ..

Study/운영체제 2020.10.18

Java - 단순 연결 리스트 구현하기

모든 코드는 github LinkedList LinkedList는 요소와 요소 간 연결link을 이용해서 List를 구현한다. 중요한 것은 연결은 무엇인가를 파악하는 것이다. 반대로 무엇이 연결이 아닌가, 를 생각해보는 것도 의미가 있을 것이다. ArrayList는 배열을 이용하므로 요소와 요소가 딱 붙어있다. 비유하자면 일렬로 줄 서 있다고 할 수 있다. LinkedList는 그렇지 않다. LinkedList의 요소들은 각각 어딘가에 흩어져 있고, 각 요소는 다음 요소가 어디 있는지에 대한 정보만 가지고 있다. ArrayList는 원하는 데이터가 몇 번 인덱스에 있는 줄만 알면 바로 접근할 수 있다. 반면 LinkedList는 첫 번째 요소에게 다음 요소의 위치를 묻고, 두 번째 요소에게 세 번째 요소..

자료구조 2020.10.17

선택정렬SelectionSort

선택정렬 SelectionSort 전체 코드 package com.algorithm; import java.util.Arrays; public class SelectionSort { /** * 배열 array와 array의 두 인덱스(i, j)를 매개변수로 받아서 * i번 인덱스와 j번 인덱스에 저장된 요소를 바꾸는 메소드 */ public static void swapElements(int[] array, int i, int j) { int temp = array[i]; array[i] = array[j]; array[j] = temp; } /** * 배열 array와 start값을 매개변수로 받는다. * array[]의 start번째 인덱스부터 시작하여 마지막 인덱스까지 반복하면서 * 가장 작은 값이..

알고리즘 2020.10.08

알고리즘

? 상수시간constant time 실행 시간이 입력 크기에 의존하지 않으면 알고리즘은 상수 시간constant time을 따른다고 한다. 이를테면, n개의 배열에서 브래킷 연산([])을 사용하여 요소 중 하나에 접근할 때 이 연산은 배열의 크기와 관계 없이 같은 수의 동작을 한다. ? 선형linear 실행 시간이 입력 크기에 비례하면 알고리즘은 선형linear이라고 한다. 배열에 있는 요소를 더한다면 n개 요소에 접근하여 n-1번 더하기 연산을 해야 한다. 연산 요소(요소 접근과 더하기)의 총 횟수는 2n-1이고 n에 비례한다. ? 이차quadratic 실행시간이 n^2에 빌례하면 알고리즘은 이차quadratic라고 한다. 말하자면 리스트에 있는 어떤 요소가 두 번 이상 나타나는지를 알고 싶다고 하자...

알고리즘 2020.10.08

Ajax통신할 때 리턴타입이 void인 경우

{"readyState":4,"responseText":"","status":200,"statusText":"parsererror"} 간단한 게시판을 만드는데, 삭제 버튼 구현 중에, 자꾸 위와 같은 에러 메세지가 났다. 상태코드가 200인데 parse에러? 문제는 컨트롤러에 있었다. //삭제 api @DeleteMapping("/api/v1/posts/{id}") public void deletePost(@PathVariable Long id) { postsService.delete(id); //return id; } 이게 에러가 나던 코드다. 따로 리턴해 줄 필요가 없을 것 같아서 아무것도 반환하지 않았는데, 무언가를 반환해야만 제대로 처리되었다고 인식했다. 그래서 반환타입을 Long으로 바꾸고 파라..

ERROR!!!!!!! 2020.10.06

Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'local.server.port' in value "${local.server.port}"

ApiController테스트 중 에러가 발생했다. 테스트 코드는 이렇다. @Test public void posts_등록한다() throws Exception { //given String title = "title"; String content = "content"; PostsSaveRequestDto requestDto = PostsSaveRequestDto.builder() .title(title) .content(content) .author("author") .build(); String url = "http://localhost:" + port +"/api/v1/posts"; //when ResponseEntity responseEntity = restTemplate.postForEntity..

ERROR!!!!!!! 2020.10.06

nested exception is org.hibernate.exception.ConstraintViolationException

JPA 테스트 중 에러 Referential integrity constraint violation: "FKR1BMBLQIR7DALMH47NGWO7MCS: PUBLIC.REPLY FOREIGN KEY(BOARD_BNO) REFERENCES PUBLIC.BOARD(BNO) (75)"; SQL statement: insert into reply (board_bno, replyer, text) values (?, ?, ?) [23506-200]could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute ..

ERROR!!!!!!! 2020.10.02

DBMS 개요

데이터베이스와 DBMS 데이터베이스가 단순히 데이터를 저장하는 공간을 의미한다면, DBMS(Database Management System)는 그 공간을 운영하는 소프트웨어라고 할 수 있다. DBMS의 특징 데이터의 무결성 데이터에 오류가 나는 것을 방지하기 위해 데이터베이스는 제약 조건Constraint이라는 특성을 가진다. 이를테면 학생을 데이터화 할 때, 학번은 유일해야 한다. 같은 학번을 가진 학생은 존재할 수 없다. 이럴 때, '학번'은 제약조건이 된다. 이 제약조건을 기준으로 데이터를 저장해두면, 오류가 발생할 확률이 줄어들 것이다. 데이터의 독립성 데이터베이스의 크기를 변경하거나 데이터 파일의 저장소를 변경하더라도, 기존에 작성된 응용프로그램은 전혀 영향을 받지 않아야 한다. 즉, 서로 의존..

MariaDB 2020.09.28

Ubuntu 20.04 IP고정

IP가 자꾸 바뀌는 바람에 EC2서버에 접속도 안 되고 AWS보안 설정도 다시 일일이 바꿔야 했다. IP고정하는 게 귀찮아서 한 번은 그렇게 했는데 또 같은 일이 발생했다. 귀찮다고 미뤘다가 더 귀찮은 일을 하게 된 셈이다. 나중에 같은 작업을 해야 할 때 다시 검색하기 귀찮아서 정리해둔다. 1. ip확인 $ ip address 또는 $ ifconfig 명령어로 이더넷 이름과 아이피를 확인한다. 참고로 ifconfig를 사용하기 위해서 먼저 설치해야 한다. ifconfig설치 $ sudo apt-get install net-tools 빨간색 네모로 표시한 곳이 이더넷 이름이다. 이것을 확인한다. ip는 대역대만 알면 된다. 추가로 $ ip route 해당 명령어로 gateway주소도 확인한다. IP고정 ..

infra 2020.09.25

머스태치Mustache

템플릿 엔진이란? 템플릿 엔진이란, 지정된 템플릿 양식과 데이터를 합쳐 HTML문서를 출력하는 소프트웨어를 말한다. JSP, Freemarker, React, Vue 모두 지정된 템플릿과 데이터를 이용해서 HTML을 생성하는 템플릿 엔진이다. 다만 JSP, Freemarker는 서버 템플릿 엔진이고, 리액트나 뷰는 클라이언트 템플릿 엔진이다. 서버에서 작동하느냐, 클라이언트(브라우저)에서 작동하느냐, 이 차이가 둘을 구분하는 기준이다. 머스태치란? 템플릿 엔진이다. 많은 언어를 지원해서, 어떤 언어로 다루느냐에 따라 서버 템플릿 엔진이기도 하고, 클라이언트 템플릿 엔진이기도 하다. 다른 템플릿 엔진의 단점 JSP, Velocity 스프링부트에서 권장하지 않음 Freemarker 템플릿 엔진치고 기능이 과..

Spring 2020.09.16

JPA Auditing으로 생성 시간/수정시간 자동화

JPA Auditing으로 생성 시간/수정시간 자동화 Java8버전부터 LocalDate와 LocalDateTime이 등장했다. LocalDate가 나오기 전 Date나 Calendar클래스에는 다음과 같은 문제가 있었다. 불변 객체가 아니어서 멀티 쓰레드 환경에서 문제가 발생할 수 있었다. Calendar는 월(month) 설계가 잘못 되었다. 10월을 나타내는 Calendar.OCTOBER의 숫자 값이 10이 아니고 9였다. 이러한 문제점을 LocalDate가 해결했다. JPA Auditing사용하기 @Getter @MappedSuperclass @EntityListeners(AuditingEntityListener.class) public class BaseTimeEntity { @CreatedDa..

Spring 2020.09.15

등록/수정/조회 API

이전 글에서 이어지는 글입니다. 등록/수정/조회 API 해당 API를 만들기 위해 3개의 클래스가 필요하다. Request 데이터를 받을 DTO API 요청을 받을 Controller 트랜잭션, 도메인 기능 간의 순서를 보장하는 Service 서비스 계층에서 비즈니스 로직을 처리해야 한다는 생각은 오해다. 서비스는 트랜잭션, 도메인 간 순서만 보장한다. DTOs DTO(Data Transfer Object)는 계층 간 데이터 교환을 위한 객체를 말한다. Domain Model 도메인이라 불리는 개발 대상을 모든 사람이 동일한 관점에서 이해할 수 있고, 공유할 수 있도록 단순화시킨 것을 도메인 모델이라고 한다. 택시 앱이라면 배차,탑승,요금 등 모두 도메인이 될 수 있다. @entity가 사용되는 영역 역..

Spring 2020.09.14

Spring Boot 게시판 만들기

참고 도서 : 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 Spring Boot 게시판 만들기 요구사항 분석 기능 조회 등록 수정 삭제 회원 구글 / 네이버 로그인 로그인한 사용자만 글 작성 본인이 작성한 게시물 권한 관리 사용 기술 Spring 2.3.3 H2 JPA Hibernate Entity를 만들 때 참고 사항 PK는 Long타입으로 잡고 Auto_increament로 잡는 게 좋다. 복합 키나, 유니크 키 기타 다른 키를 PK로 잡을 경우 아래와 같은 문제가 발생할 수 있다. FK를 맺을 때 다른 테이블에서 복합키 전부를 갖고 있거나, 중간 테이블을 하나 더 둬야 하는 상황이 발생한다. 인덱스에 좋은 영향을 끼치지 못한다. 유니크한 조건이 변경될 경우, PK전체를 수정해야 할 수도 있다. ..

Spring 2020.09.14

Spring Data JPA

JPA 스프링 레거시 프로젝트에서는 MyBatis를 이용해 Mapper를 만들고 직접 쿼리를 만들었다. 쿼리를 만들 때는 그 쿼리가 제대로 작동하는 지, 우선 해당 데이터베이스에서 직접 테스트하고, 코드에 적용했다. 간단한 CRUD 정도는 문제가 되지 않았지만, 그것도 쌓이면 나름 시간이 걸리는 일이다. 무엇보다 여러 개의 테이블을 join해서 작업하는 경우에는 쿼리를 짜는 데에만 꽤 오랜 시간이 걸렸다. 책에서도 "실제 개발 시간보다 SQL을 다루는 시간이 더 많았"다. "테이블 모델링에만 집중하고 객체를 단순히 테이블에 맞추는 기형적인 형태"였다고 설명한다. 내가 생각하기에 데이터는 거의 모든 것이다. 복잡하게 생각할 것도 없이 자명하다. 객체를 이용해 데이터를 운반하지만, 객체는 할 일을 마치면 가..

Spring 2020.09.14

스프링 시큐리티 어노테이션

스프링 시큐리티 어노테이션 주로 사용하는 세 가지 어노테이션 @Secured 스프링 시큐리티 초기부터 사용했다. ()안에 'ROLE_ADMIN' 같은 문자열 또는 문자열 배열을 이용한다. @PreAuthorize, @PostAuthorize 스프링3버전부터 지원한다. ()안에 표현식을 사용할 수 있어서 최근에는 더 많이 사용한다. http.authorizeRequests() .antMatchers("/sample/all").permitAll() .antMatchers("/sample/member").access("hasRole('ROLE_MANAGER')") .antMatchers("/sample/admin").access("hasRole('ROLE_ADMIN'..

Spring legacy 2020.09.13

JSP에서 스프링 시큐리티 사용하기

JSP에서 스프링 시큐리티 사용하기 스프링 시큐리티 관련 정보를 출력하려면 시큐리티 관련 태그 라이브러리를 선언해야 한다. 태그는 과 principal이라는 이름의 속성을 사용한다. 사용 예제 admin.jsp ... principal : MemberVO : 사용자 이름 : 사용자 아이디: 사용자 권한 : .. ...결과 표현식을 이용하는 동적 화면 어떤 페이지에서, 일반 사용자로 로그인했을 때 보여지는 내용과, 관리자로 로그인 했을 때 보여지는 내용이 달라야 한다면(이를테면 관리자용 메뉴 같은 것) 표현식을 이용하여 동적으로 구성할 수 있다. 표현식 설명 hasRole([role]) hasAuthority([authority]) 해당 권한이 있으면 true hasAnyRole([role,role2]) ..

Spring legacy 2020.09.13

Spring Security - UserDetailsService

UserDetailsService JDBC를 이용한 인증방식의 단점은 사용자의 여러 정보들 중에서 제한적인 내용만을 이용한다는 점이다. 스프링 시큐리티에서는 username이라고 하는 정보만을 이용하므로 이름이나 이메일 등 자세한 정보를 이용할 경우 충분하지 못하다. UserDetailsService이스를 구현하는 방식으로 이러한 문제를 해결할 수 있다. UserDetailsService는 loadUserByUserName이라는 하나의 메서드만 가지고 있다. loadUserByUserName()는 UserDetails를 반환하는데, UserDetails는 사용자의 정보와 권한 정보를 담는 인터페이스다. UserDetails는 getAuthorities(), getPassword(), getUserName..

Spring legacy 2020.09.13

Spring Security - 기존 테이블을 이용하는 인증방법

기존의 테이블을 이용한 시큐리티 인증 방법 1. 테이블 설계 회원 테이블과 권한 테이블 -- 회원 테이블 create table tbl_member( userid varchar(50) not null primary key, userpw varchar(100) not null, username varchar(100) not null, regdate timestamp default now(), moddate timestamp default now(), enabled char(1) default '1' ); -- 권한 테이블 create table tbl_member_auth( userid varchar(50) not null, auth varchar(50) not null, constraint fk_memb..

Spring legacy 2020.09.13