ORM(Object Relational Mapping)

객체지향 언어를 이용하여, 서로 호환되지 않는 타입 간의 데이터를 변환하는 기술

 

Apache iBatis

SQL 데이터 베이스와 객체 간 매핑을 지원해주는 persistence framework

 

Spring Data JPA 인터페이스

단계별로 필요한 기능까지만 사용 가능

- Repository: 기본 repository 인터페이스, 어떤 메소드도 제공하지 않음 

- CrudRepository: Repository + CRUD 기능 제공

- PagingAndSortingRepository: CrudRepository + 페이징, 정렬 기능 제공

- JpaRepository: PagingAndSortingRepository + Spring Data JPA repository 전체 기능

 

 

인터페이스에 작성한 메소드 이름이 곧 쿼리 표현이 됨

ex: List<Event>findByEventStatusAndEventNameOrCapacity(String eventStatus, String eventName, Integer capacity);

- 다이나믹 쿼리를 만들 수는 없음

- 사용 가능한 키워드

  - distinct, and, or, is, not, between, lessThan, lessThanEqual, greaterThen, greaterThenEqual

  - null, isNotNull, like, startingWith, endingWith, containing, orderBy, in true, false, ignoreCase

  - join 등 복잡한 표현은 불가

 

 

@Param: 쿼리 메소드 입력 파라미터에 사용하여 애노테이션 기반 파라미터 바인딩할 때 사용

@QUERY: 직접 JPQL을 작성하고 싶을 때 사용

@ NoReositoryBean: 빈으로 등록하고 싶지 않은 인터페이스를 지정할 수 있음

 - 특정 쿼리 메소드를 기본 메소드로 지정하는 방식으로 운영 가능

 - 특정 메소드를 선택적으로 사용하거나 api에 노출하고자 할 때도 사용하는 테크닉

https://www.toptal.com/developers/gitignore

 

gitignore.io

Create useful .gitignore files for your project

www.toptal.com

위와 같이 Java와 Intellij+all 을 선택해주면 된다.

시작화면

위 화면은 시작화면입니다. 

 

 

글 등록을 클릭하면 게시글 등록 화면이 생성됩니다. 

글을 성공적으로 등록하면 다시 메인 화면으로 이동합니다. 메인 화면에서 등록한 값의 테이블을 확인할 수 있습니다.

제목을 보면 글자가 파란색인데 링크입니다. 클릭하면 수정 화면으로 이동합니다.

 

 

 

수정 화면에서는 글 번호와 작성자를 수정할 수 없습니다. 

 

delete 버튼을 클릭해보겠습니다.

 

delete가 성공하면 alert기능이 수행되고 article is deleted!! 글이 나타납니다. 

 

글이 삭제된 것을 확인할 수 있습니다. 

 

이번엔 수정 기능을 시험 해보겠습니다. 수정 기능을 시험해보기 위해서 글을 등록해보곘습니다.

 

 

 

 

 

아래 화면을 통해 수정이 된 것을 확인할 수 있습니다.

'Today I Learned' 카테고리의 다른 글

orm, ibatis, Spring Data JPA  (0) 2022.01.31
gitignore 자동 생성 및 인텔리제이에서 gitignore 생성  (0) 2021.12.24
kendogrid 한번에 update, create 하기  (0) 2021.12.16
KendoGrid empty  (0) 2021.12.15
kendogrid batch  (0) 2021.12.14

KendoGrid는 행을 추가하거나 행을 변경하면 행의 개수만큼 update, create 함수가 실행된다. 하지만 update나 create를 많이 해야 하는 상황이 올 수록 update와 create가 호출될 때마다 서버에 요청을 보낸다면 한 번에 다량의 요청을 보내게 된다. 이를 해결하기 위해서 데이터를 한 번에 보내는 방법을 생각해보았다. 

 

한 가지 방법으로 전역 변수를 생성하고 update와 create을 호출할 때마다 호출했던 AJAX를 빼고 JSON 형식으로 update와 create에서 받는 데이터를 전역 변수로 할당한다. 그리고 save 버튼을 클릭하면 update와 create 함수가 호출되는데 saveChange기능을 호출한 다음 AJAX를 사용하여 서버에 호출하면 된다. 

 

현재 kendoGrid를 통해서 reorder 기능을 사용하고 있습니다. 테이블을 reorderable 하게 변경하여 열의 순서를 변경할 수 있습니다. 하지만 순서를 변경한 다음 조회 버튼을 클릭하면 값들은 월래 순서를 찾아가지만 위 속성의 이름을 가르키는 곳은 그대로 있는 문제가 발생합니다. 해당 문제를 해결하기 위해서 empty 기능을 사용했습니다.

 

empty 기능을 해당 테이블을 clear 해주는 기능이 있습니다.

 

kendoGrid에 empty 기능을 사용하기 전 상태입니다. 조회 버튼을 클릭하면 아래 컬럼들은 변경되지만 이름은 변경되지 않는 문제가 있습니다.

kendoGrid에 empty를 사용한 후입니다. 조회 버튼을 클릭하면 컬럼의 순서를 변경하였어도 다시 월래대로 돌아오는 것을 확인할 수 있습니다.

 

empty는 아래와 같은 방식으로 사용할 수 있습니다.

$("#GridMain").empty();

kendogrid batch의 값을 true로 설정하면 update나 create 함수가 변화한 행의 개수만 큼 실행되던 것이 한번만 실행되고 받는 데이터는 배열 형식으로 받는 것을 확인하였다.

 

그래서 data에 접근할 때 for문을 돌리도록 변경하였다.

                create: function (e) {

                    var GridKey = "GridMain";
                    var RowStatus = "INSERT";

                    companyid = "<%=Session["LOGINCOMPANYID"]%>";
                    divisionid = "<%=Session["LOGINDIVISIONID"]%>";
                    createuserid = "<%=Session["LOGINUSERID"]%>";
                    modifyuserid = "<%=Session["LOGINUSERID"]%>";

                    for (let i = 0; i < e.data.models.length; i++) {
                        let item = e.data.models[i];
                        Main_param += "{ RowStatus: '" + RowStatus + "'";
                        Main_param += ", GROUPID: '" + item.GROUPID + "'";
                        Main_param += ", GROUPNAME: '" + item.GROUPNAME + "'";
                        Main_param += ", AUTHSEQUENCE: '" + item.AUTHSEQUENCE + "'";
                        Main_param += ", REMARK: '" + item.REMARK + "'";
                        Main_param += ", COMPANYID: '" + companyid + "'";
                        Main_param += ", DIVISIONID: '" + divisionid + "'";
                        Main_param += ", ISVALID: '" + item.ISVALID + "'";
                        Main_param += ", ISUSE: '" + item.ISUSE + "'";
                        Main_param += ", CREATEUSERID: '" + createuserid + "'";
                        Main_param += ", CREATETIME: 'CREATETIME'";
                        Main_param += ", MODIFYUSERID: '" + modifyuserid + "'";
                        Main_param += ", MODIFYTIME: 'MODIFYTIME'";
                        Main_param += ", LASTHISTORYKEY: 'LASTHISTORYKEY'";
                        Main_param += "},";
                    }    
                    e.success();
                }

'Today I Learned' 카테고리의 다른 글

kendogrid 한번에 update, create 하기  (0) 2021.12.16
KendoGrid empty  (0) 2021.12.15
음료수 얼려먹기 나의 답안  (0) 2021.12.09
kendogrid-isNew()  (0) 2021.12.09
이것이 코딩테스트이다 - 게임 개발  (0) 2021.12.08
n, m = map(int, input().split())

ice =   [[0]*m for _ in range(n)]
visit = [[0]*m for _ in range(n)]
result = 0


def dfs(x, y):
    dirs = [(-1,0), (0, -1), (1, 0), (0, 1)]
    
    visit[y][x] = 1
    
    for dir in dirs:
        xd = x + dir[0]
        yd = y + dir[1]
        if xd>=0 and xd<m and yd >=0 and yd <n:
            if visit[yd][xd] == 0 and ice[yd][xd] == 0:
                dfs(xd, yd)

for i in range(n):
    str1 = input()
    for j in range(len(str1)):
        ice[i][j] = int(str1[j])

for i in range(n):
    for j in range(m):
        if ice[i][j] == 0 and visit[i][j] == 0:
            result += 1
            dfs(j, i)
            
print(result)

'Today I Learned' 카테고리의 다른 글

KendoGrid empty  (0) 2021.12.15
kendogrid batch  (0) 2021.12.14
kendogrid-isNew()  (0) 2021.12.09
이것이 코딩테스트이다 - 게임 개발  (0) 2021.12.08
깃 크라켓 사용해보기  (0) 2021.12.05

오늘은 테이블에 행을 추가 하는 것이 아니라면 아이디를 수정하지 못하게 막는 기능을 찾아봤습니다. 

일반적으로 특정 속성을 편집하지 못하게 막는 것은 간단하게 할 수 있지만 특정 상태에서는 가능하게 특정 상태에서는 불가능하게 하는 것은 조금 복잡한 문제였습니다. 인터넷을 잘 찾아보니 isNew()라는 함수가 눈에 띄었습니다. isNew는 테이블의 행의 상태가 create인지 edit인지 구별할 수 있는 기능을 제공합니다. 따라서 해당 함수를 사용해서 평소에는 ID 값을 편집하지 못하게 막고 행을 추가할 때만 아이디 값을 수정할 수 있게끔 했습니다.

 

isNew를 사용한 코드

edit function (e) { 
            console.log(EDIT, e.model, e.model.isNew(), e.model.id, e.model._defaultId);
            if (!e.model.isNew()) {
                if (e.container.find("input").attr("name") == "GROUPID") {
                    this.closeCell();
                }
          
        }

 

'Today I Learned' 카테고리의 다른 글

kendogrid batch  (0) 2021.12.14
음료수 얼려먹기 나의 답안  (0) 2021.12.09
이것이 코딩테스트이다 - 게임 개발  (0) 2021.12.08
깃 크라켓 사용해보기  (0) 2021.12.05
TIL JUNIT, MOCKITO  (0) 2021.12.01

오늘아래와 같은 방식으로 문제를 해결하였다. 하나의 테스트케이스만으로 검증하여서 진짜 맞는 코드인지 분간하기가 어렵다. 

내가 푼 풀이

n, m = map(int, input().split())
x, y, dir = map(int, input().split())

visited = [[0]*m for _ in range(n)]
field1 = [[0]*m for _ in range(n)]
dirs = [(0, -1), (1, 0), (0, 1), (-1, 0)]
result = 1
visited[y][x] = 1

for i in range(n):
    list1 = list(map(int, input().split()))
    for j in range(len(list1)):
        if list1[j] == 1:
            field1[i][j] = 1
            
def dfs(x, y, d,time):
    global result
    d -= 1
    if d <0:
        d = 3
        
    xd = x + dirs[d][0]
    yd = y + dirs[d][1]
    
    if xd>=0 and xd <m and yd>=0 and yd<n:
        if visited[yd][xd] != 1 and field1[yd][xd] !=1:
            result +=1
            visited[yd][xd] = 1
            time = 0
            dfs(xd, yd, d, time)
        else : 
            if time >= 4:
                return
            else:
                dfs(x, y,d, time +1)        
    else:
        
        if time >= 4:
            return
        else:
            dfs(x, y,d, time +1)   
            
dfs(x, y, dir, 0)

정답

n , m = map(int, input().split())

d = [[0] * m for _ in range(n)]
x, y, direction = map(int, input().split())
d[x][y] = 1

array = []
for i in range(n):
    array.append(list(map(int, input().split())))
    
dx = [-1, 0, 1, 0]
dy = [0, 1, 0 ,-1]

def turn_left():
    global direction
    direction -= 1
    if direction == -1:
        direction = 3
        
count = 1
turn_time = 0
while True:
    turn_left()
    nx = x + dx[direction]
    ny = y + dy[direction]
    if d[nx][ny] == 0 and array[nx][ny] == 0:
        d[nx][ny] = 1
        x = nx
        y = ny
        count += 1
        turn_time = 0
        continue 
    else:
        turn_time += 1
    if turn_time == 4:
        nx = x - dx[direction]
        ny = y - dy[direction]
        if array[nx][ny] == 0:
            x = nx
            y = ny
        else:
            break
        turn_time = 0
print(count)

'Today I Learned' 카테고리의 다른 글

kendogrid batch  (0) 2021.12.14
음료수 얼려먹기 나의 답안  (0) 2021.12.09
kendogrid-isNew()  (0) 2021.12.09
깃 크라켓 사용해보기  (0) 2021.12.05
TIL JUNIT, MOCKITO  (0) 2021.12.01

월래 Todya I Learned는 꾸준하게 하루마다 작성해야 하지만 쉽지 않군요 그래서 이번주에 배운 내용 중 생각나고 중요한 내용 위주로 간략하게 적어보겠습니다. 

 

이번주는 스프링에대해 공부를 해봤습니다. 스프링 데이터 코드를 단순하게 깃과 연동해서 올려왔었지만 이번에는 특별하게 깃 크라켄이란 것을 사용해보았습니다.

 

GitKraken

https://www.gitkraken.com/

 

Free Git GUI for Windows, Mac, Linux | GitKraken

Unleash GitKraken, the free Git GUI for Windows, Mac & Linux! This intuitive Git GUI simplifies and streamlines Git processes.

www.gitkraken.com

깃크라켄은 GUI 환경에서 깃을 다를 수 있는 툴입니다. 

 

 

우선 깃 크라켄을 이용하기 위해서 Repository를 하나 만듭니다.

Repository를 다 만든었으면 깃크라켄을 열어 Clone a repo를 클릭합니다.

그럼 (클론>GitHub.com) 으로가서 Repository to clone에서 아까 만든 Repository의 이름을 입력하면 검색이 되는데 클릭합니다.

Clone the repo! 버튼을 클릭하면 아래와 같이 깃크라켄이 첫 커밋을 하겠다는 메시지가 나타나면 Initialize 버튼을 클릭합니다.

 

버튼을 클릭하였다면 아래와 같은 화면을 볼 수 있습니다.

해당 화면에서는 Push하기전에 커밋햇던 내용을 Undo로 취소하거나 커밋한 내요을 Push하는 등의 기능을 사용해 보았습니다.

 

화면을 보면 Branch는 master이고 아까 깃 크라켄에게 부탁한 Initial commit이 된 것을 확인할 수 있습니다.

 

우측에는 커밋할 당시 생성된 커밋 메시지를 확인할 수 있고 수정할 수도 있습니다.

 

그러면 File > Preferences... 로 넘어가 봅시다.

아래 화면으로 넘어가면 Gitflow를 선택하고 Develop에서 develop 그리고 Initialize Gitflow를 누릅니다.

https://gist.github.com/ihoneymon/a28138ee5309c73e94f9

 

git 을 기반으로 git-flow를 사용하여 애플리케이션 배포버전을 관리하자.

git 을 기반으로 git-flow를 사용하여 애플리케이션 배포버전을 관리하자. GitHub Gist: instantly share code, notes, and snippets.

gist.github.com

위와 같이 진행하고 있는 작업은 브랜치를 새로 만드는 것입니다. develop 브랜치를 따로 만들어 사용하는 이유는 아직 변경사항 개발이 완료되지는 않았지만 커밋하여 구성원과 코드 공유를 하기 위해서입니다. master 브랜치는 실제로 배포가 준비된 코드만 올라가야되기 때문에 master 브랜치로 현재 개발중인 코드를 커밋하지 않습니다. develop 브랜치를 완성하였으면 master 브랜치와 병합을 하여 master 브랜치에 develop 브랜치를 반영하여 줍니다.

 

다시 본화면으로 돌아오면 develop 브랜치가 생성된 것을 확인할 수 있습니다. 그럼 develop 브랜치를 더블클릭하면 develop 브랜치로 넘어가서 작업할 수 있습니다.

이제 코드 작업을 한 뒤 깃 크라켄으로 돌아오면

아래와 같이 되는데 우측에서 원하는 파일들만 골라서 커밋을 따로따로 진행할 수도 있습니다.

커밋을 완료하였다면 push를 통해 깃허브에 반영할 수 있습니다.  push는 되도록이면 모든 커밋을 한다음 마지막에 하는 것이 좋은데 가끔 실수하여 커밋을 되돌려야 할 때가 있습니다. 그때 push가 되지 않은 상황이라면 undo 기능을 통해 되돌릴 수 있습니다.

 

이제 developer 브랜치에서 개발이 완료되었으면 master 브랜치와 병합해주도록 합시다.

merge 방법은 

https://www.youtube.com/watch?v=mS8oUqqc2G8 

아래 영상을 참조해주세요

 

'Today I Learned' 카테고리의 다른 글

kendogrid batch  (0) 2021.12.14
음료수 얼려먹기 나의 답안  (0) 2021.12.09
kendogrid-isNew()  (0) 2021.12.09
이것이 코딩테스트이다 - 게임 개발  (0) 2021.12.08
TIL JUNIT, MOCKITO  (0) 2021.12.01

+ Recent posts