맵핑 어노테이션

mil nil·2022년 12월 28일
0

TIL (Today I Learned)

목록 보기
41/74

오늘 공부한 것

맵핑 어노테이션

객체 - 테이블 맵핑 : @Entity, @Table
필드 - 컬럼의 팹핑 : @Column
기본키의 맵핑 : @Id
조인 맵핑 : @ManyToOne, @JoinColumn

@Entity

@Entity 어노테이션을 클래스에 선언하면 그 클래스는 JPA가 관리한다.

그러므로 DB의 테이블과 Class(VO, DTO)와 맵핑한다면 반드시 @Entity를 붙여주어야 한다.

@Entity가 붙은 클래스에는 다음 제약사항이 필요하다.

  1. 필드에 final, enum, interface, class를 사용할 수 없습니다.
  2. 생성자중 기본 생성자가 반드시 필요합니다.

@Entity의 속성

  1. name : 엔티티 이름을 지정합니다. 기본값으로 클래스 이름을 그대로 사용합니다.

@Table

@Table 어노테이션은 맵핑할 테이블을 지정합니다.

@Table의 속성

  1. name : 매핑할 테이블의 이름을 지정합니다.
  2. catalog : DB의 catalog를 맵핑합니다.
  3. schema : DB 스키마와 맵핑합니다.
  4. uniqueConstraint : DDL 쿼리를 작성할 때 제약 조건을 생성합니다.

@Column

@Column 어노테이션은 객체 필드와 DB 테이블 컬럼을 맵핑합니다.

@Column의 속성 (name 외에 잘 사용되지 않음)

  1. name : 맵핑할 테이블의 컬럼 이름을 지정합니다;
  2. insertable : 엔티티 저장시 선언된 필드도 같이 저장합니다.
  3. updateable : 엔티티 수정시 이 필드를 함께 수정합니다.
  4. table : 지정한 필드를 다른 테이블에 맵핑할 수 있도록 합니다.
  5. nullable : NULL을 허용할지, 허용하지 않을지 결정합니다.
  6. unique : 제약조건을 걸 때 사용합니다.
  7. columnDefinition : DB 컬럼 정보를 직접적으로 지정할 때 사용합니다.
  8. length : varchar의 길이를 조정합니다. 기본값으로 255가 입력됩니다.
  9. precsion, scale : BigInteger, BigDecimal 타입에서 사용합니다. 각각 소수점 포함 자리수, 소수의 자리수를 의미합니다.

@Id

JPA가 객체를 관리할 때 식별할 기본키를 지정합니다.

참조: [Spring-boot JPA] 맵핑 어노테이션 @Entity, @Table, @Column, @Id 속성과 개념 정리

알고리즘 공부

햄버거 만들기
1(빵),2(채소),3(고기),1(빵)이 순서대로 들어오는 경우 햄버거를 한 개 만들었다고 카운트 한다. 만약 1, 1, 2, 3, 1, 2, 3, 1, 이라면 첫 번째 햄버거가 만들어지고 남은 순서인 1, 2, 3, 1로 다시 햄버거를 만들 수 있다.

실패한 나의 첫번째 답안 (시간 초과로 하다만 것..)

import java.util.*;

class Solution {
    public int solution(int[] ingredient) {
        ArrayList<Integer> ingredientList = new ArrayList<Integer>(Arrays.asList(2,1,1,2,3,1,2,3,1));  //ArrayList로 전환
        int order = 1;
        for (int i = 0; i <= ingredientList.size(); i++) {
            if (i == ingredientList.size()) {break;}
            if (order == ingredientList[i]) {order++;}
            else {order = 1;}
            if (order == 4) {
                ingredientList.subList(i-3, i).clear();
                i = 0;
            }
        }
        int answer = 0;
        return answer;
    }
}
  • ArrayList 혹은 List로 변경하여 풀이를 하려고 하였으나 변경하다가 시간을 다 보내 결국 답을 찾아보았다. 왜 배열이 List로 전환이 안 되었는지 모르겠다. 그래서 아래 로직은 제대로 작성되지도 않았다.
    참조: [Java] int 배열을 List로 변환하기
    -> int 배열을 Arrays.List로 전환하게 되면 int에서 Integer로 자동 형변환이 되지 않기 때문에 정상적으로 전환되지 않는다.

병두님의 도움을 받아 작성한 답안

import java.util.*;

class Solution {
    public int solution(int[] ingredient) {
        Stack<Integer> stack = new Stack<>();  //stack 만들기
        int count = 0;
        for (int i : ingredient) {
            stack.add(i);
            if (stack.size() >= 4 && stack.elementAt(stack.size() - 1) == 1
                && stack.elementAt(stack.size() - 2) == 3
                && stack.elementAt(stack.size() - 3) == 2
                && stack.elementAt(stack.size() - 4) == 1) {
                count++;
                stack.pop();stack.pop();stack.pop();stack.pop();
            }
        }
        return count;
    }
}
  • Stack를 활용하여 강의에서 배웠던 stack을 직접적으로 사용해 볼 수 있었다. pop을 4번을 반복적으로 하는 코드는 그닥 실용적이지는 않은 것 같다.

다른 사람의 답안

import java.util.*;

class Solution {
    public int solution(int[] ingredient) {
        int[] stack = new int[ingredient.length];  //stack 만들기
        int sp = 0;
        int count = 0;
        for (int i : ingredient) {
            stack[sp++] = i;
            if (stack.length >= 4
                && stack[sp - 1] == 1
                && stack[sp - 2] == 3
                && stack[sp - 3] == 2
                && stack[sp - 4] == 1) {
                count++;
                sp -= 4;	//index를 -4 낮춰 햄버거로 만들어진 재료를 제거
            }
        }
        return count;
    }
}
  • stack이 아니지만 stack처럼 사용한 짧게 잘 요약된 답안이다. stack에서 필요한 기능만 배열에 잘 접목하였다. sp라는 변수를 index로 사용하여 아주 쉽고 빠르게 접근하였다.
profile
자바 배우는 사람

0개의 댓글