목록2024/10 (82)
코딩항해기
Spring 생태계 스프링이란 하나의 기술이 아닌 여러가지 스프링 프로젝트들의 모음이다. 스프링에는 다양한 프로젝트가 있다. 이 모든 스프링 프로젝트는 스프링 프레임워크를 기반으로 동작한다. 이 때 생태계가 확장됨에 따라 사용에 어려움이 생겼다. 이 때 문제를 도와주기 위해 등장한 서브 프로젝트가 스프링 부트이다. Spring Framwork스프링 프레임워크를 사용하면 자바 기반의 어플리케이션을 만들 수 있고, 개발자들은 비즈니스 로직에 집중할 수 있는 장점이 있다. 스프링 이전에는 EJB라는 프레임워크가 있었다. EJB는 2000년대 초반 등장했고 비즈니스 로직과 앤터프라이즈 기술의 분리를 통해 편리한 애플리케이션을 개발하고자하는 목적을 가지고 있었다. 그러나 EJB는 가격이 높았고 비즈니스 로직보다..
기존 memberDAO와 boardDAO에 Service와 ServiceImpl 추가하기Client(Class)에서 new 지시자 사용없이 출력하기 아직 DAO에 new가 가득한데 이 new를 제거하는 진도까지 나가진 않았다.기존 DAO까지는 동일하며 이번 과제에서 DAO에 추가된 부분은 @Repository 어노테이션 뿐이었다.따라서 Service와 ServiceImpl만 추가된 형태이다. 먼저 ServiceImpl의 메서드 시그니처가 DAO와 통일되는 것이 중요하기 때문에 구현할 인터페이스 Service를 만들었다.public interface MemberService { List selectAll(MemberDTO memberDTO); MemberDTO selectOne(MemberDTO membe..
DB연결을 하려고 하니 Connection 객체를 만들 때 에러가 발생했다.DB가 바뀌어서 drivername 잘못 작성한 줄 알았는데 pom.xml을 보니 의존성 주입을 안했다....너무 당연한 건데 buildpath에 너무 익숙해졌던 것 같다. 바로 pom.xml dependencies Edit Starters(intellij)에 들어가서 mysql의존성을 추가했다. com.mysql mysql-connector-j runtime 추가한 후에는 maven 새로고침 잊지않기
포인터 상수 (배열의 주솟값)배열 요소의 주솟값을 확인하면 첫 번째 요소부터 순서대로 나열되어있음을 확인할 수 있다. 그리고 배열의 주솟값은 배열 첫번째 요소의 주솟값과 동일한 것을 확인 할 수 있다. 즉, 배열 시작의 주솟값을 나타내는 포인터 변수이다. 그러나 배열의 이름은 다른 포인터 변수와 달리 값의 저장이 불가능한 상수형태의 포인터이다. 이를 포인터 상수라고도 한다. 배열의 포인터 연산배열의 이름은 포인터이므로 배열의 이름을 피연산자로 해 *연산자를 사용할 수 있다. 배열의 이름은 첫 번째 요소(인덱스 0번)과 동일하므로 *연산자를 사용하게 되면 첫 번째 요소의 값이 반환된다. 위와 같은 방식으로 첫 번째 요소에는 접근할 수 있지만 배열의 다른 요소에 접근하려면 포인터 변수의 값을 증가시켜 포인터..
1. 빈칸채우기import java.util.Scanner;public class Solution { public static void main(String[] args) { String message = "Let's go!"; System.out.println("3\n2\n1"); System.out.println(message); }} 2. 디버깅문제public class Solution { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int angle1 = sc.nextInt(); int angle2 = sc.ne..
포인터C언어에서 포인터랑 메모리의 주솟값을 의미하며 주솟값을 저장하는 변수를 포인터 변수라고 한다.변수를 선언 및 초기화하면 메모리에 공간이 할당되는데, 포인터 변수를 사용하면 이 메모리 주소에 직접적으로 접근할 수 있게 된다. (주의할 점은 메모리의 주소는 실행할 때마다 임의로 변경된다.) 포인터 변수 선언과 초기화일반 변수와 포인터 변수의 차이는 변수 이름 앞에 *(애스터리스크)를 붙인다는 것에 있다. 선언하고 나면 주솟값을 저장할 수 있게 되는데 이 과정에서 &(앰퍼샌드)연산자를 사용해 변수의 주솟값을 반환할 수 있다.int num = 30; //포인터 변수에 저장할 주솟값을 줄 변수int * ptr; //포인터 변수 선언//초기화ptr = # //&지시자를 통해 반환된 주솟값을 포인터 변수..
지난번에 의존성 주입 어노테이션 중 Component에 대해 정리했다.컨테이너가 관리하는 객체라는 것을 알려주는 가장 기본적인 어노테이션이기 때문에, 전부 Component를 사용할 수도 있다. 그러나 용도에 따라 별도의 어노테이션으로 구분짓는 것이 명시적으로 나타내기 좋기 때문에 구분해서 사용한다.즉, 세 어노테이션 모두 Component의 역할(컴포넌트 스캔 가능/컨테이너 Bean 등록)을 수행한다. @Repository Persistence/Data Access LayerRepository는 DB에 접근하는 코드라는 의미로 일반적으로 DAO에 많이 사용된다. 실무에서는 DAO라는 표현을 잘 적어두지 않기 때문에 Repository 어노테이션으로 이 객체가 DAO라는 것을 알 수 있다. @Servi..
[Spring] xml Bean을 통한 의존성 주입 (CI, SI)의존성 주입 DI (Dependency Injection)Spring 컨테이너에서 객체 Bean을 먼저 생성해두고 생성한 객체를 지정한 객체에 주입하는 방식을 의존성 주입이라고 한다.기존에는 new를 사용해 개발자가 직접 관minibcake.tistory.com xml 방식의 단점전통적인 Spring에서는 xml방식을 주로 사용했으나, 객체가 무수히 많아지면 전부 xml에 작성해야하므로 양이 방대해지고, 오탈자가 있을 경우 ctrl F를 통해 원하는 객체를 찾는 것도 어려워진다. 이러한 과도한 설정 문제를 개선하기 위해 어노테이션을 활용한 설정을 개발했다.(복잡성, 유효성 검사의 어려움, 타입 안정성 부재, 추가 작업 필요 등의 단점을 ..
@Autowired를 통해 의존성 주입 시 발생하는 모호성 문제로 인해 예외가 발생했다.Autowired는 의존주입을 할 대상의 타입을 보고 자동으로 찾게 되는데 이 타입을 가진 객체가 여러 개 있어 어떤 의존주입을 해야할지 알 수 없어진 것이다. (주입대상 모호성) 이 때 해결하는 방법은 두 가지로, 1. 타입을 하나만 남기기Component 어노테이션이나 xml에서 한 가지만 컨테이너에 등록을 해서 헷갈릴 여지 자체를 주지 않는 방법이다.Component 어노테이션으로 온오프를 하게 되면 매번 패키지가 import됐다 제거됐다를 반복하게 되고 이는 컴파일이 다시 실행되므로 xml에 등록하고 사용하는 경우가 많다. (컴파일도 비용이기 때문이다) 2. @Qualifier 어노테이션으로 이름 지정하기해당 ..
기존 xml bean 태그로 작업하다 어노테이션으로 변경했더니 bean을 찾지 못하는 에러가 발생했다.xml에서 어노테이션을 인지할 수 있도록 총 2가지의 작업을 해야하는데, 범위지정이 빠져 발생한 오류였다. 기존 루트 앨리먼트 어노테이션을 인지할 수 있도록 변경한 루트 앨리먼트 어노테이션을 찾을 범위를 지정해주는 태그*test패키지 안에 있는 파일에서 어노테이션을 찾겠다는 설정이다. (해당 태그가 빠져 오류 발생)