모바일 서비스의 4가지 대표 개발 방식에는

네이티브 앱(Native App), 하이브리드 앱(Hybrid App), 웹 앱(Web App), 모바일 웹(Mobile Web)이 있다.

각각의 특징 및 장단점에 대해 알아보자.

 

네이티브 앱(Native App) : 모바일 기기에 최적화된 네이티브 언어로 개발된 앱(App)

특징 : 개발 - 해당 운영체제에 최적화되어 있는 개발 도구로 제작

          실행 - 구글 플레이스토어, 앱스토어에서 다운 설치

          안드로이드 SDK - Kotlin / Java

          IOS SDK - Swift / Objective C

장점 : 높은 퍼포먼스, 더 많은 디바이스 접근 권한, 빠른 속도와 안정성

단점 : 각 운영체제마다 개발 및 유지 보수 필요 -> 운영체제별 개발 인력 필요

          높은 개발 & 운영 비용, 심사과정 필요, 업데이트할 때마다 플레이스토어, 앱스토어를 통해야 함

(고성능의 그래픽 처리가 가능해서  2D 및 3D 게임이나 증강현실과 같은 앱 개발을 할 수 있음, 모바일의 고유 정보 이용 & 하드웨어 제어 가능)

 

하이브리드 앱(Hybrid App) : 웹 앱과 네이티브 앱의 기능을 결합하여 개발된 앱(App)으로 하나의 코드 베이스로

IOS, Android에서 모두 작동

특징 : 개발 - 모바일 웹 앱을 모바일 운영체제로 패키징(내부는 모바일 웹 앱 / 외부는 네이티브 모습)

          실행 - 구글 플레이스토어, 앱스토어에서 다운 설치

          웹 브라우저로 접속한 것과 차이 없음 But QR 코드 리더, 음성 인식 등 지원

장점 : 네이티브 API와 브라우저 API를 이용해 다양한 개발 가능

          개발 비용 & 시간 절감(네이티브 앱에 비해), 쉬운 유지 보수(네이티브 앱에 비해)

          모바일 웹보다 빠른 속도, 디바이스 고유 정보 접근 가능

단점 : 제한적 기능, 네이티브 앱보다 느린 속도, 네이티브 앱 개발 지식 필요, 심사과정 필요

          브라우저 성능에 따라 앱 성능에 영향

(웹 앱의 단점을 보완, 앱의 기반이 되는 콘텐츠 영역은 HTML 기반의 웹 앱으로 제작, 최종 앱 배포에 필요한 패키징 처리만 Android, IOS 플랫폼 안에서 처리, 모바일의 고유 정보 이용 & 하드웨어 제어 가능)

 

웹 앱(Web App) : 모바일 웹과 비슷하지만 구동 방식이 앱처럼 보이게 한 앱(App)

특징 : 개발 - 웹 개발 방식과 동일(HTML, CSS, JavaScript 등)

          실행 - 웹 브라우저(단일 페이지 방식)

          겉모습과 구동 방식이 마치 네이티브 같은 웹 페이지(모바일 웹보다 모바일 최적화)

장점 : 운영체제별로 개발할 필요가 없음 -> 비용 & 시간 절감, 심사과정 불필요

단점 : 디바이스 접근 권한 제한, 웹 브라우저에서 검색하거나 URL로 접근해야 함

(모바일 웹과 네이티브 앱을 결합한 것으로 모바일 웹의 특징을 가지면서 네이티브 앱의 일부 장점도 가짐, 모바일의 고유 정보 이용 불가 & 하드웨어 제어 불가)

 

모바일 웹(Mobile Web) : 모바일 화면에 맞게 구성한 웹(Web)

특징 : 개발 - 웹 개발 방식과 동일(HTML, CSS, JavaScript 등)

          실행 - 웹 브라우저(풀 브라우저 방식)

           PC 웹 페이지를 모바일에 맞게 줄인 모습

장점 : 운영체제별로 개발할 필요가 없음 -> 비용 & 시간 절감, 심사과정 불필요

단점 : 디바이스 접근 권한 제한, 웹 브라우저에서 검색하거나 URL로 접근해야 함

(데스크탑 브라우저에서 실행되는 웹 애플리케이션을 모바일 스크린 크기로 줄여 놓은 것, 모바일의 고유 정보 이용 불가 & 하드웨어 제어 불가)

 

모바일 웹과 웹 앱을 비교해 보면 둘은 웹 개발과 동일하게 만들어지기 때문에 모바일 운영체제별로 개발할

필요가 없기 때문에 시간과 비용 측면에서 효과적이다. 하지만 접속하기 위해선 브라우저를 이용해야 하므로

직접 검색하거나 URL로 접근해야 한다. 이처럼 더 많은 단계를 거치고, 직접 입력해야 하는 노력이 필요하다는 점에서

접근성이 좋지 않다는 단점이 있다.

 

모바일 웹과 웹 앱의 실행 방식 차이

 

모바일 웹(풀 브라우저 방식 Full Browsing) : 화면 일부분이 변경될 때 화면 전체 내용을 서버에서 새로 받아오는

방식으로 페이지 Reload를 할 경우 속도가 느리다는 단점이 있다. 또한 모바일 기기 특성상 이동 중에 서버 접속 장애가

발생할 위험이 있다.

 

웹 앱(단일 페이지 방식 SPA) : 브라우저에 최초 한 번 페이지 전체를 받아오고, 화면 일부분이 변경, 요청될 때

해당 부분만 Ajax를 통해 데이터를 바인딩 하는 방식이다.

 

모바일 웹은 풀 브라우저 방식으로 실행 속도가 느린 반면, 웹 앱은 단일 페이지 방식으로 실행 속도가 빠르다.

점차 모바일 환경이 발달하면서 PC 기반으로 개발된 웹 페이지들이 모바일 환경으로 적응하게 되었고,

이 과정에서 모바일 최적화를 위한 다양한 방법들이 등장했다. 반응형과 적응형도 이 과정에서 등장했다.

한 개의 URL로 다양한 디바이스 사이즈에 맞게 변동하는 반응형 웹(Responsive Web)과 각 디바이스 별

템플릿을 만들어 접근한 디바이스에 따라 알맞은 템플릿을 제공하는 적응형 웹(Adaptive Web)이 대표적이다.

Spring Tools for Eclipse 기준 설명

1. https://spring.io/tools 접속하여 STS(for Eclipse) 설치 후 실행
2. 상단 Quick Access에 Git Repositories 검색 후 클릭
3. Git Repositories 탭으로 가서 Clone a Git repository
4. gitlab 사이트 Import 하려는 프로젝트로 들어가서 Clone -> Clone with HTTPS 부분 복사
5. STS로 돌아가서 URL 부분에 붙여넣기 하면 세부 항목까지 자동 입력(Port는 빈칸)
6. master 브랜치 체크 후 Next & Finish
7. Git Repositories 탭의 프로젝트 우클릭 후 Import Projects
8. Package Explorer에 받아진 프로젝트 확인
9. Window > Preferences > Server > Runtime Environments > 우측 Add > Tomcat 버전 선택 > Browse...
   클릭 후 다운로드한 Tomcat 폴더 선택 > Finish > Apply and Close

   (Tomcat 다운로드 https://tomcat.apache.org)
10. 상단 Quick Access에 Servers 검색 후 클릭
11. Servers 탭에서 우클릭 > New > Server > Tomcat 버전 선택 > Available 부분에 있는 항목 선택 후 Add > Finish
12. Project는 우클릭 후 Maven > Update Project...와 최상단 탭 Project > Clean...

13. x 표시가 사라지지 않는다면 설치되지 않은 플러그인이 있는지 확인

     - Lombok을 사용하는 경우 -

     Eclipse의 경우 Maven / Gradle에 Lombok Dependency가 추가되어 있어도 Lombok을 따로 설치해 줘야 한다.

     https://projectlombok.org/download 접속하여 다운로드한다.

     다운로드한 lombok.jar 파일을 STS 실행파일이 있는 위치로 옮긴다.

     명령 프롬프트(CMD)를 관리자 권한으로 실행시킨 후 lombok.jar 파일이 위치한 폴더로 이동한다.

      lombok.jar 파일이 C:\STS\contents\stsRELEASE  폴더 안에 있다면

      cd C:\STS\contents\stsRELEASE 명령어로 이동 후 java -jar lombok.jar

      Lombok을 설치할 IDE를 체크한 후 Install / Update 버튼을 클릭, 설치가 끝났다면 실행 중인 STS를 재실행

      STS 실행파일 위치에 실행파일명.ini 파일 열어보면 -javaagent: 부분에 lombok.jar 경로가 추가된 것 확인

14. 13번에서 추가로 설치한 플러그인이 있다면 12번으로 간다.
15. Servers 탭의 Tomcat 더블클릭 후 Overview 탭 Ports의 HTTP 부분 옆 Port Number 변경

     & Modules 탭의 Path를 / 로 변경
16. Servers 탭의 Tomcat 우클릭 > Clean...

17. Start the server 후 브라우저 실행하여 localhost:8080 입력 (Port Number가 8080일 경우)

import java.util.Arrays;

public class Solution {
	
	// 요격 시스템
	
	public static int solution(int[][] targets) {
		int answer = 0;
		
		// 개구간 (s, e)로 표현되는 폭격 미사일을 s와 e에서 발사하는 요격 미사일로는 요격할 수 없기 때문에 각각의 원소에 10을 곱한 후
		// 첫 번째 원소에서는 +1을, 두 번째 원소에서는 -1을 하여 폐구간 [r, f]을 만든 후 [Java] 프로그래머스 [Level-3] 단속카메라 문제처럼 풀도록 한다.
		int[][] tempTargets = new int[targets.length][targets[0].length];
		
		for (int i = 0; i < targets.length; i++) {
			tempTargets[i][0] = targets[i][0] * 10 + 1;
			tempTargets[i][1] = targets[i][1] * 10 - 1;
		}
		
		// int[][] targets = {{4, 5}, {4, 8}, {10, 14}, {11, 13}, {5, 12}, {3, 7}, {1, 4}};
		// int[][] tempTargets = {{41, 49}, {41, 79}, {101, 139}, {111, 129}, {51, 119}, {31, 69}, {11, 39}};
		
		// 이차원 배열 tempTargets 정렬
		Arrays.sort(tempTargets, (o1, o2) -> {
			if (o1[1] == o2[1]) { // 뒤 원소가 같을 경우
				return o1[0] - o2[0]; // 앞 원소 기준 오름차순
			} else { // 뒤 원소가 같지 않을 경우
				return o1[1] - o2[1]; // 뒤 원소 기준 오름차순
			}
		});
		
		// int[][] tempTargets = {{11, 39}, {41, 49}, {31, 69}, {41, 79}, {51, 119}, {111, 129}, {101, 139}};
		
		int missilePoint = tempTargets[0][0] - 1; // 10 // 정렬 후 첫 번째 첫 원소보다 작은 값을 넣기 위해 -1 => 최초 무조건 아래 if문에 걸리게 됨
		
		for (int i = 0; i < tempTargets.length; i++) {
			
			if (missilePoint < tempTargets[i][0]) {
				missilePoint = tempTargets[i][1];
				System.out.println(missilePoint + "번 위치에 미사일 설치");
				answer++;
			}
		}
		
		return answer;
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[][] targets = {{4, 5}, {4, 8}, {10, 14}, {11, 13}, {5, 12}, {3, 7}, {1, 4}};
		
		System.out.println(solution(targets)); // 3
	}
}

프로그래머스 요격 시스템 문제 풀이 Java

Function : 매개변수를 받아 특정 계산(작업)을 수행하고 결과를 반환하는 기능

 

Procedure : 특정 작업을 위한 쿼리들의 블록(함수와 거의 비슷)
장점 : 1. 하나의 요청으로 여러 SQL문을 실행(네트워크 부하를 줄일 수 있음)
           2. 네트워크 소요 시간을 줄여 성능 개선
           3. 여러 어플리케이션과 공유 가능(API처럼 제공 가능)
           4. 기능 변경이 편함
단점 : 1. 문자나 숫자열 연산에 사용하면 오히려 C, Java보다 느린 성능을 보일 수 있음
           2. 유지보수가 어려움(프로시져가 앱의 어디에 사용되는지 확인 어려움)

 

Trigger : 사전적 뜻은 총의 방아쇠로 총의 방아쇠를 당기는 것과 같이 어떤 이벤트의 자동 실행

 

View : 하나 이상의 테이블에서 원하는 모든 데이터를 선택하여 간단하게 나타낸 것
장점 : 1. 각 사용자에 따라 알맞게 데이터를 보여줄 수 있음
           2. 자주 쓰이는 쿼리문을 간단하게 사용하기 위해 사용
           3. 뷰에 나타나지 않는 데이터를 제어하여 데이터 보안이 가능
단점 : 1. 뷰의 정의를 변경할 수 없음
           2. INSERT문은 원본 테이블에서 실행해야 하며, PRIMARY KEY, NOT NULL 등의 제약사항이 위배되는 경우

              삽입이 불가한 등 많은 제약이 따름
           3. 독자적인 인덱스를 가질 수 없음

 

Package : 패키지는 프로시저 또는 함수 등 서브 프로그램을 하나로 묶어놓은 객체
장점 : 1. 모듈화(함수와 프로시저 등 서브 프로그램을 한곳에 모아서 사용할 수 있으므로 관리 및 사용하기가 수월)
           2. 캡슐화(선언부만 외부에 공개되고, 본문은 감춰져 있기 때문에 접근을 제어하여 오용을 방지)
           3. 성능(패키지의 서브 프로그램 호출 시 패키지 전체가 메모리에 올라가 다른 서브 프로그램 호출 시 훨씬 나은

               성능을 보임)

 

Index : 테이블의 검색 속도를 향상시키는 자료구조

 

Synonyms : 사전적 뜻은 동의어이다. 데이터베이스 객체의 NickName

 

Cursor : 특정 SQL 문장을 처리한 결과를 담고 있는 영역을 가리키는 일종의 포인터

Spring Security의 Bcrypt 암호화를 사용해 만든 비밀번호를 유저 테이블에 저장할 때
입력한 비밀번호에 랜덤한 salt 값이 더해져 암호화되는 것을 알 수 있다.

(같은 비밀번호로 변경해도 저정되는 값이 다르기 때문)
그렇다면 입력한 비밀번호 외에 암호화에 사용된 salt 값이 어떤 값인지, 그 값은 어디에 저장되는지 알아야 한다.
하지만 Bcrypt 암호화의 salt 값따로 저장되는 게 아닌 해시값에 이어붙여 함께 저장되기 때문에 따로 salt 값 저장이

필요하지 않다.


$2a$10$Yz4die0hPMjS3.6njaxmmOyrwArwsC9NEs5kwOI0Gh04uLjHaON2e
위와 같은 형태로 해시값을 생성하는데 이는 '$'로 구분되는 3가지의 필드라고 보면 된다.

'2a'는 사용된 bcrypt알고리즘의 버전을 의미하며
'10'은 cost factor이다. cost factor가 10이라는 의미는 key derivation 함수가 2^10번 반복 실행된다는 의미로 이 값이 커질 수록 해시값을 구하는 속도가 느려진다.
'Yz4die0hPMjS3.6njaxmmOyrwArwsC9NEs5kwOI0Gh04uLjHaON2e'가 바로 salt 값과 암호화된 비밀번호 값이다.

Template Engine : 지정된 템플릿 양식과 데이터가 합쳐져 HTML 문서를 출력하는 소프트웨어로,

크게 서버 템플릿 엔진 과 클라이언트 템플릿 엔진으로 나뉜다.

 

Template Engine의 장점

1. 코드 양 ↓

2. 재사용성 ↑

3. 유지보수에 용이

 

여러 서버 템플릿 엔진의 특징

JSP : Spring Boot에서 권장하지 않음

Velocity : Spring Boot에서 권장하지 않음

Freemarker : 템플릿 엔진으로서 기능이 너무 다양(숙련도 낮은 경우 비즈니스 로직이 추가됨)

Thymeleaf : Spring에서 권장, 문법이 어려움

Mustache : 심플하고 서버, 클라이언트 모두 사용 가능

Annotation이란? 사전적 의미로는 주석이라는 뜻이다.

자바에서 Annotation은 코드 사이에 주석처럼 쓰이며 특별한 의미, 기능을 수행하도록 하는 기술이다.

즉, 프로그램에게 추가적인 정보를 제공해 주는 메타데이터(meta data)라고 볼 수 있다.(meta data : 데이터를 위한 데이터)

다음은 어노테이션의 용도를 나타낸 것이다.

1. 컴파일러에게 코드 작성 문법 에러를 체크하도록 정보를 제공한다.

2. 소프트웨어 개발 툴이 빌드나 배치 시 코드를 자동으로 생성할 수 있도록 정보를 제공한다.

3. 실행 시(런타임 시)특정 기능을 실행하도록 정보를 제공한다.

기본적으로 어노테이션을 사용하는 순서는 다음과 같다.

1. 어노테이션을 정의

2. 클래스에 어노테이션을 배치

3. 코드가 실행되는 중 Reflection(프로그램이 실행 중에 자신의 구조와 동작을 검사하고, 조사하고, 수정하는 것)을 이용하여 추가 정보를 획득하여 기능을 실시

 

Annotation 종류

 

@ComponentScan

@Component, @Service, @Repository, @Controller, @Configuration이 붙은 클래스 Bean들을 찾아서 Context에 bean등록을 해주는 Annotation

 

@Component

개발자가 직접 작성한 Class를 Bean으로 등록하기 위한 Annotation

 

@Bean

개발자가 직접 제어가 불가능한 외부 라이브러리등을 Bean으로 만들려할 때 사용되는 Annotation

 

@Autowired

field, setter method, constructor에서 사용하며 Type에 따라 알아서 Bean을 주입 해준다.

Controller 클래스에서 DAO나 Service에 관한 객체들을 주입 시킬 때 많이 사용

 

Bean을 주입받는 3가지 방식

1. @Autowired

2. setter

3. 생성자(@AllArgsConstructor 사용) -> 권장방식

 

@Inject

@Autowired 어노테이션과 비슷한 역할

 

@Controller

Spring의 Controller를 의미하며, Spring MVC에서 Controller 클래스에 쓰인다.

 

@RestController

Spring에서 Controller 중 View로 응답하지 않는, Controller를 의미

method의 반환 결과를 JSON 형태로 반환

 

@Controller 와 @RestController 차이

@Controller
API와 view를 동시에 사용하는 경우에 사용
대신 API 서비스로 사용하는 경우는 @ResponseBody를 사용하여 객체를 반환
view(화면) return이 주목적

@RestController
view가 필요없는 API만 지원하는 서비스에서 사용
Spring 4.0.1부터 제공
@RequestMapping 메서드가 기본적으로 @ResponseBody 의미를 가정
data(json, xml 등) return이 주목적

즉, @RestController = @Controller + @ResponseBody

 

@Service

Service Class에서 쓰인다. 비즈니스 로직을 수행하는 Class라는 것을 나타내는 용도

 

@Repository

DAO Class(DataBase에 접근하는 method를 가지고 있는 Class)에서 쓰인다.

 

@EnableAutoConfiguration

Spring Application Context를 만들 때 자동으로 설정하는 기능을 켠다.

(classpath의 내용에 기반해서 자동으로 생성, 만약 tomcat-embed-core.jar가 존재하면 톰캣 서버가 setting)

 

@Configuration

@Configuration을 클래스에 적용하고 @Bean을 해당 Class의 method에 적용하면 @Autowired로 Bean을 부를 수 있다.

 

@Required

setter method에 적용해주면 Bean 생성시 필수 프로퍼티 임을 알린다.

 

@Qualifier("id")

@Autowired와 같이 쓰이며, 같은 타입의 Bean 객체가 있을 때 해당 아이디를 적어 원하는 Bean이 주입될 수 있도록 한다.

 

@Resource

@Autowired와 마찬가지로 Bean 객체를 주입해주는데 차이점이 있다.

Autowired는 타입으로, Resource는 이름으로 연결한다.

 

@PostConstruct, @PreConstruct

의존하는 객체를 생성한 이후 초기화 작업을 위해 객체 생성 전/후에 실행해야 할 method 앞에 붙인다.

 

@PreDestroy

객체를 제거하기 전에 해야할 작업을 수행하기 위해 사용

 

@PropertySource

해당 프로퍼티 파일을 Environment로 로딩하게 해준다.

 

@ConfigurationProperties

yaml파일 읽는다. default로 classpath:application.properties 파일이 조회

 

@Lazy

지연로딩을 지원

@Component나 @Bean Annotation과 같이 쓰는데 Class가 로드될 때 스프링에서 바로 bean등록을 마치는 것이 아니라 실제로 사용될 때 로딩이 이뤄지게 하는 방법

 

@Value

properties에서 값을 가져와 적용할 때 사용

 

@SpringBootApplication

@Configuration, @EnableAutoConfiguration, @ComponentScan 3가지를 하나의 어노테이션으로 합친 것

 

@RequestMapping

요청 URL을 어떤 method가 처리할지 mapping해주는 Annotation

 

@CookieValue

쿠키 값을 parameter로 전달 받을 수 있는 방법

 

@CrossOrigin

CORS 보안상의 문제로 브라우저에서 리소스를 현재 origin에서 다른 곳으로의 AJAX요청을 방지하는 것

 

@ModelAttribute

view에서 전달해주는 parameter를 Class(VO/DTO)의 멤버 변수로 binding 해주는 Annotation

 

@GetMapping

@RequestMapping(Method=RequestMethod.GET)과 같다.

 

@SessionAttributes

Session에 data를 넣을 때 쓰는 Annotation

 

@Valid

유효성 검증이 필요한 객체임을 지정

 

@InitBinder

@Valid 어노테이션으로 유효성 검증이 필요하다고 한 객체를 가져오기전에 수행해야할 method를 지정

 

@RequestAttribute

Request에 설정되어 있는 속성 값을 가져올 수 있다.

 

@RequestBody

요청이 온 데이터(JSON이나 XML형식)를 바로 Class나 model로 매핑하기 위한 Annotation

 

@RequestHeader

Request의 header값을 가져올 수 있다. 메소드의 파라미터에 사용

 

@RequestParam

@PathVariable과 비슷, request의 parameter에서 가져오는 것

 

@RequestPart

Request로 온 MultipartFile을 바인딩

 

@ResponseBody

HttpMessageConverter를 이용하여 JSON 혹은 xml로 요청에 응답할 수 있게 해주는 Annotation

 

@PathVariable

method parameter 앞에 사용하면서 해당 URL에서 {특정값}을 변수로 받아 올 수 있다.

 

@ExceptionHandler

해당 클래스의 예외(Exception)를 캐치하여 처리

 

@ControllerAdvice

Class 위에 ControllerAdvice를 붙이고 어떤 예외를 잡아낼 것인지는 각 메소드 상단에

@ExceptionHandler(예외클래스명.class)를 붙여서 기술

 

@RestControllerAdvice

@ControllerAdvice + @ResponseBody

 

@ResponseStatus

사용자에게 원하는 response code와 reason을 return해주는 Annotation

 

@EnableEurekaServer

Eureka 서버로 만들어준다.

 

@EnableDiscoveryClient

Eureka 서버에서 관리될 수 있는 클라이언트 임을 알려주기위한 Annotation

 

@Transactional

데이터베이스 트랜잭션을 설정하고 싶은 method에 이 Annotation을 적용하면 method 내부에서 일어나는 데이터베이스 로직이 전부 성공하거나, 데이터베이스 접근중 하나라도 실패하면 다시 롤백할 수 있게 해주는 Annotation

 

@Cacheable

method 앞에 지정하면 해당 method를 최초에 호출하면 캐시에 적재하고 다음부터는 동일한 method 호출이 있을 때 캐시에서 결과를 가져와서 return하므로 method 호출 횟수를 줄여주는 Annotation

 

@CachePut

캐시를 업데이트하기 위해서 method를 항상 실행하게 강제하는 Annotation

 

@CacheEvict

캐시에서 데이터를 제거하는 트리거(Trigger)로 동작하는 method에 붙이는 Annotation

 

@CacheConfig

클래스 레벨에서 공통의 캐시설정을 공유하는 기능

 

@Scheduled

Linux의 crontab처럼 정해진 시간에 실행해야하는 경우에 사용

 

Lombok Annotation 종류

 

@NoArgsConstructor

기본 생성자를 자동으로 추가

 

@AllArgsConstructor

모든 필드 값을 파라미터로 받는 생성자를 추가

 

@RequiredArgsConstructor

final(값이 할당되면 더 이상 변경할 수 없음) 이나 @NonNull인 필드 값만 파라미터로 받는 생성자를 추가

 

@Getter

Class 내 모든 필드의 Getter method를 자동 생성

 

@Setter

Class 내 모든 필드의 Setter method를 자동 생성

 

@ToString

Class 내 모든 필드의 toString method를 자동 생성

 

@EqualsAndHashCode

equals와 hashCode method를 오버라이딩 해주는 Annotation

 

@Builder

어느 필드에 어떤 값을 채워야 할지 명확하게 정하여 생성 시점에 값을 채워준다.

 

Constructor 와 @Builder 차이

생성 시점에 값을 채워주는 역할은 똑같다. 하지만 Builder를 사용하면 어느 필드에 어떤 값을 채워야 할지 명확하게

인지할 수 있다. 해당 Class의 Builder 패턴 Class를 생성 후 생성자 상단에 선언 시 생성자에 포함된 필드만 빌더에 포함

 

@Data

@Getter, @Setter, @EqualsAndHashCode, @AllArgsConstructor을 포함한 Lombok에서 제공하는 필드와 관련된

모든 코드를 생성

 

JPA Annotation 종류

 

@Entity

실제 DB의 테이블과 매칭될 Class임을 명시

즉, 테이블과 링크될 클래스임을 나타냄

 

@Table

Entity Class에 매핑할 테이블 정보를 알려줌

 

@Id

해당 테이블의 PK 필드를 나타냄

 

@GeneratedValue

PK의 생성 규칙을 나타냄

 

@Column

테이블의 컬럼을 나타내며, 굳이 선언하지 않더라도 해당 Class의 필드는 모두 컬럼이 됨

<Oracle>

프로시저(PROCEDURE) 조회 쿼리

SELECT *
  FROM USER_SOURCE
 WHERE TYPE = 'PROCEDURE'
   AND NAME = '프로시저명'

 

함수(FUNCTION) 조회 쿼리

SELECT *
  FROM USER_SOURCE
 WHERE TYPE = 'FUNCTION'
   AND NAME = '함수명'

 

 

프로시저와 함수의 차이

 

프로시저(PROCEDURE) : 넓은 의미로는 어떤 업무를 수행하기 위한 절차를 뜻한다.

함수(FUNCTION) : 위의 프로시저의 각 프로세스를 수행하기 위해 필요한 기능들을 함수라 한다.

 

프로시저(PROCEDURE) 함수(FUNCTION)
특정 작업을 수행 특정 계산을 수행
리턴 값을 가질 수도 안 가질 수도 있음 리턴 값을 반드시 가져야 함
리턴 값을 여러 개 가질 수 있음 리턴 값 오직 하나만 가질 수 있음
서버(DB) 단에서 기술 화면(Client) 단에서 기술
수식 내에서 사용 불가 수식 내에서만 사용 가능
단독으로 문장 구성 가능 단독으로 문장 구성 불가

 

+ Recent posts