'인강 > 자바 ORM 표준 JPA 프로그래밍 - 기본편' 카테고리의 다른 글
연관관계 매핑 (0) | 2024.09.10 |
---|---|
엔티티 매핑 (0) | 2024.09.09 |
연관관계 매핑 (0) | 2024.09.10 |
---|---|
엔티티 매핑 (0) | 2024.09.09 |
1. 연관관계의 주인은 외래 키의 위치를 기준으로 정해야함
2. 단방향 매핑 설계를 목표로 하고 필요할 때 양방향 매핑을 추가한다.
방향(Direction) : 단방향, 양방향
다중성(Multiplicity) : 다대일, 일대다, 일대일
연관관계의 주인(Owner) : 객체 양뱡향 연관관계는 관리 주인이 필요
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
@Column(name = "USERNAME")
private String name;
@Column(name = "TEAM_ID") // 참조 대신에 외래 키를 그대로 사용
private Long teamId;
}
@Entity
public class Team {
@Id @GeneratedValue
private Long id;
private String name;
}
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
@Column(name = "USERNAME")
private String name;
@ManyToOne
@JoinColumn(name = "TEAM_ID") // 객체의 참조와 테이블의 외래 키를 매핑
private Team team;
}
@Entity
public class Team {
@Id @GeneratedValue
private Long id;
private String name;
}
1. 멤버가 소속해있는 팀을 찾을때
// 객체를 테이블에 맞추어 모델링
// 멤버 조회
Member findMember = em.find(Member.class, member.getId());
// 해당 멤버 팀 id값 저장
Long findTeamId = findMember.getTeamId();
// 팀 조회(위에 저장한 팀 id값을 이용)
Team findTeam = em.find(Team.class, team.getId());
// 객체 지향 모델링
// 멤버 조회
Member findMember = em.find(Member.class, member.getId());
//참조를 사용해서 연관관계 조회
Team findTeam = findMember.getTeam();
다양한 연관관계 매핑 (0) | 2024.10.28 |
---|---|
엔티티 매핑 (0) | 2024.09.09 |
@Column
속성 | 설명 | 기본값 |
name | 필드와 매핑할 테이블의 컬럼 이름 | 객체의 필드 이름 |
insertable updatable |
등록, 변경 가능 여부 설정 | true |
nullable | null값 허용 여부 설정 false -> not null 제약조건 붙음 |
|
unique | 해당 컬럼의 유니크 제약조건 이름이 랜덤하게 들어가서 사용 잘 안함 |
|
length | 문자 길이 제약조건, String 타입에서만 사용 | 255 |
다양한 연관관계 매핑 (0) | 2024.10.28 |
---|---|
연관관계 매핑 (0) | 2024.09.10 |
- 클래스 내부 멤버변수에서 사용할 데이터 타입을 외부에서 지정하는 기법이다.
- 제네릭의 타입 인자로 기본형(int, double)은 사용할 수 없다.
- 제네릭은 extends 키워드를 붙여서 타입 매개변수를 제한하고 원하는 타입과 하위 타입들만 받도록 설정할 수 있다.
- 제네릭 메서드를 정의할 때는 메서드의 반환 타입 왼쪽에 <T>와 같이 타입 매개변수를 적어준다.
- 명확한 반환 타입이 필요할때는 제네릭 메서드 반환 타입이 없을때는 와일드카드를 사용하는게 좋다.
클래스 수준의 제네릭 타입 파라미터를 사용하는 메서드 vs 메서드 수준의 제네릭 타입 파라미터를 사용하는 제네릭 메서드
package genericTest;
public class Main2 {
public static void main(String[] args) {
GenericBox2<Integer> genericBox2 = new GenericBox2<>();
// 클래스 수준의 제네릭 타입 파라미터를 사용하는 메서드
genericBox2.genericTypeMethod(123); // value = 123
//genericBox2.genericTypeMethod("123"); // !! 에러발생 !! GenericBox2객체에 Integer를 할당했기 때문에
// 메서드 수준의 제네릭 타입 파라미터를 사용하는 제네릭 메서드
genericBox2.genericMethod2("kim"); // value = kim
genericBox2.genericMethod2(123); // value = 123
genericBox2.genericMethod2(true); // value = true
}
}
package genericTest;
public class GenericBox2 <T>{
public T genericTypeMethod (T value) {
System.out.println("value = " + value);
return value;
}
public <Z> Z genericMethod2 (Z value) {
System.out.println("value = " + value);
return value;
}
}
public class Generic<T extends parent> {
}
public <T> T instanceMethod1 (T value) {
System.out.println("value = " + value);
return value;
}
public <S extends Number> S instanceMethod2 (S value) {
System.out.println("value = " + value);
return value;
}
static <T> T genericStaticMethod1 (T value) {
System.out.println("value = " + value);
return value;
}
public void wildCard (Box<?> value) {
System.out.println("value.getValue() = " + value.getValue());
}
public void wildCard2 (Box<? extends Animal> value) {
System.out.println("value.getValue() = " + value.getValue());
}
- 아래의 코드가 실행되도록 수정하세요.
1. Dog, Cat 클래스 추가
2. AnimalMethod 클래스에서 checkUp, bigger 제네릭 메서드 추가
3. checkUp메서드 body에 System.out.println(매개변수); 추가
4. bigger 메서드 호출시 size값이 더 큰 객체 출력
// (출력예시)
// checkUp 메서드 호출시
// Dog{name='강아지', size=200}
// Cat{name='고양이', size=100}
// bigger 메서드 호출후 result값 출력시
// result = Dog{name='강아지', size=200}
package genericMethod.quiz;
public class Main {
public static void main(String[] args) {
Dog dog = new Dog("강아지", 200);
Cat cat = new Cat("고양이", 100);
AnimalMethod.checkUp(dog);
AnimalMethod.checkUp(cat);
Animal result = AnimalMethod.bigger(dog, cat);
System.out.println("result = " + result);
}
}
다음중 옳지 않은 것은?
package genericMethod;
public class GenericMethod<S> {
public <T> T instanceMethod1 (T value) { // 1
System.out.println("value = " + value);
return value;
}
public <S extends Number> S instanceMethod2 (S value) { // 2
System.out.println("value = " + value);
return value;
}
static <T> T genericStaticMethod1 (T value) { // 3
System.out.println("value = " + value);
return value;
}
S instanceMethod3 (S value) { // 4
System.out.println("value = " + value);
return value;
}
static S genericStaticMethod2 (S value) { // 5
System.out.println("value = " + value);
return value;
}
}
5
다음중 틀린것을 찾으세요.
1. 클래스 내부 멤버변수에서 사용할 데이터 타입을 외부에서 지정하는 기법이다.
2. 제네릭의 타입 인자로 기본형(int, double)은 사용할 수 없다.
3. 제네릭은 extends 키워드를 붙여서 타입 매개변수를 제한하고 원하는 타입과 하위 타입들만 받도록 설정할 수 있다.
4. 복수 타입 파라미터를 지정할 수 없다.
4
추상클래스 이론 문제 (0) | 2024.07.24 |
---|---|
instanceof 이론 문제 (0) | 2024.07.23 |
상속 이론 문제 (0) | 2024.07.17 |
static (0) | 2024.07.15 |
접근제어자 (0) | 2024.07.11 |
1. 아래의 코드가 실행되도록 수정하세요.
- Dog, Cat, Animal(부모) 클래스 추가
- animalBox 제네릭 클래스 추가
- animalBox.setValue(객체) 호출후 animalBox.getValue() 출력시 아래 출력예시와 같이 나오도록 코드 수정
// (출력예시)
// animalBox.getValue() = Animal{name='고양이', age=12}
// animalBox.getValue() = Animal{name='강아지', age=13}
package generic.quiz;
public class Main {
public static void main(String[] args) {
Animal animal = new Animal("동물", 0);
Cat cat = new Cat("고양이", 12);
Dog dog = new Dog("강아지", 13);
AnimalBox<Animal> animalBox = new AnimalBox<>();
animalBox.setValue(cat);
System.out.println("animalBox.getValue() = " + animalBox.getValue()); // animalBox.getValue() = Animal{name='고양이', age=12}
animalBox.setValue(dog);
System.out.println("animalBox.getValue() = " + animalBox.getValue()); // animalBox.getValue() = Animal{name='강아지', age=13}
}
}
1. useNoticeBoard, useuseNoticeBoard, useInformationBoard 메서드와 같이 중복되는 코드를 useBoard메서드를 구현하여 중복 제거
2. 게임 게시판(gameBoard) 클래스 추가
(출력예시)
공지사항 게시판 사용
공지사항 게시판의 글이 정상적으로 추가 되었습니다.
자유 게시판 사용
자유 게시판의 글이 정상적으로 추가 되었습니다.
정보 게시판 사용
자유 게시판의 글이 정상적으로 추가 되었습니다.
게임 게시판 사용
게임 게시판의 글이 정상적으로 추가 되었습니다.
package abstract1.quiz;
public class Main {
public static void main(String[] args) {
NoticeBoard noticeBoard = new NoticeBoard();
FreeBoard freeBoard = new FreeBoard();
InformationBoard informationBoard = new InformationBoard();
useNoticeBoard(noticeBoard);
useuseNoticeBoard(freeBoard);
useInformationBoard(informationBoard);
// TODO 한개의 메서드를 통해 동작 처리
// useBoard(noticeBoard);
// useBoard(freeBoard);
// useBoard(informationBoard);
// useBoard(gameBoard);
}
public static void useNoticeBoard (NoticeBoard noticeBoard) {
System.out.println("공지사항 게시판 사용");
noticeBoard.createBoard();
System.out.println("");
}
public static void useuseNoticeBoard (FreeBoard freeBoard) {
System.out.println("자유 게시판 사용");
freeBoard.createBoard();
System.out.println("");
}
public static void useInformationBoard (InformationBoard informationBoard) {
System.out.println("정보 게시판 사용");
informationBoard.createBoard();
System.out.println("");
}
//TODO 출력예시와 같이 나오도록 아래 메서드 구현(다형적 참조 사용)
public static void useBoard (Board board) {
board.createBoard();
}
}
package abstract1.quiz;
public class Board {
public void createBoard () {
System.out.println("");
}
}
package abstract1.quiz;
public class FreeBoard{
public void createBoard () {
System.out.println("글이 정상적으로 작성되었습니다.");
}
}
package abstract1.quiz;
public class InformationBoard{
public void createBoard () {
System.out.println("글이 정상적으로 작성되었습니다.");
}
}
package abstract1.quiz;
public class NoticeBoard{
public void createBoard () {
System.out.println("글이 정상적으로 작성되었습니다.");
}
}