728x90

숫자를 영어로 표현한 문자열을 숫자로 바꾸어 반환

 

public long solution(String numbers) {

long answer = 0;

int len = numbers.length();

while(numbers.length()>2){

 

if(numbers.startsWith("zero")){

answer= answer*10;

numbers= numbers.replaceFirst("zero","");

}else if(numbers.startsWith("one")){

answer= answer*10+1;

numbers=numbers.replaceFirst("one","");

}else if(numbers.startsWith("two")){

answer= answer*10+2;

numbers=numbers.replaceFirst("two","");

}else if(numbers.startsWith("three")){

answer= answer*10+3;

numbers=numbers.replaceFirst("three","");

}else if(numbers.startsWith("four")){

answer= answer*10+4;

numbers= numbers.replaceFirst("four","");

}else if(numbers.startsWith("five")){

answer= answer*10+5;

numbers= numbers.replaceFirst("five","");

}else if(numbers.startsWith("six")){

answer= answer*10+6;

numbers= numbers.replaceFirst("six","");

}else if(numbers.startsWith("seven")){

answer= answer*10+7;

numbers= numbers.replaceFirst("seven","");

}else if(numbers.startsWith("eight")){

answer= answer*10+8;

numbers= numbers.replaceFirst("eight","");

}else if(numbers.startsWith("nine")){

answer= answer*10+9;

numbers= numbers.replaceFirst("nine","");

}

if(numbers.length()<3)break;

}

return answer;

}

앞에서부터 영어 문자를 찾아 숫자로 치환 

 

개선 

 

public long solution2(String numbers) {

return Long.parseLong(

numbers.replaceAll("zero", "0")

.replaceAll("one", "1")

.replaceAll("two", "2")

.replaceAll("three", "3")

.replaceAll("four", "4")

.replaceAll("five", "5")

.replaceAll("six", "6")

.replaceAll("seven", "7")

.replaceAll("eight", "8")

.replaceAll("nine", "9")

);

}

모든 영문자를 치환하고 parseLong 메소드 사용 

 

개선

 

public long solution3(String numbers) {

String[] numbers_arr = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};

 

for (int i = 0; i < numbers_arr.length; i++) {

numbers = numbers.replaceAll(numbers_arr[i], String.valueOf(i));

}

 

long answer = Long.parseLong(numbers);

return answer;

}

영문을 배열로 바꾸어 반복문을 사용하고 영문은 String.valueOf로 숫자형으로 변환

'Java > Coding Test' 카테고리의 다른 글

등수 매기기 문제풀이  (0) 2023.09.15
삼각형의 완성조건(2) 문제풀이  (0) 2023.09.15
공 던지기 문제풀이  (0) 2023.09.14
숨어있는 숫자 덧셈(2) 문제풀이  (0) 2023.09.13
외계어 사전  (0) 2023.09.12
728x90

공은 옆사람 건너띄고 다음사람에게만 던지며 

마지막 배열의 원소 다음은 처음 원소와 맞닿아 있다.

 

k번 던질 때 마지막으로 던지는 사람은?

 

public int solution(int[] numbers, int k) {

Queue<Integer> list = new LinkedList<>();

for (int j = 0; j < numbers.length; j++) {

list.offer(numbers[j]);

}

for (int i = 0; i < k-1; i++) {

list.offer(list.poll());

list.offer(list.poll());

}

return list.peek();

}

맨 마지막 사람과 처음 사람이 맞닿아 있는것을 표현하기위해서  Queue 로 표현했다.

 

 

다른 풀이

k-1번 던진다는 뜻은 0번 인덱스에서 +2씩 k-1번 인덱스로 옮긴다는것이다. 

=> 2k-2번 인덱스가  마지막으로 던질 사람이다. 

만약 3명이 3번 던진다면 5번인덱스 => 1,2,3,1,2   5번 인덱스는 ==2

식으로 나타내면 numbers[(2*k-2)%numbers.length+1]이다.

public int solution2(int[] numbers, int k) {

return numbers[(2*k-2)%numbers.length];

}

'Java > Coding Test' 카테고리의 다른 글

삼각형의 완성조건(2) 문제풀이  (0) 2023.09.15
영어가 싫어요 문제풀이  (0) 2023.09.14
숨어있는 숫자 덧셈(2) 문제풀이  (0) 2023.09.13
외계어 사전  (0) 2023.09.12
특이한 정렬 문제풀이  (1) 2023.09.12
728x90

 

Annotation 을 생성한다.

 

Annotation은 Interface형식이다

public @interface MyAnnotation {

String value() default "http://www.naver.com";

}

내부에는 어노테이션에서 받을 속성값을 적을 수 있는데 

기존 클래스 형식으로 적지 않는다.

String value() default "http://www.naver.com";

입력받을 값의 타입 속성명() 

default값을 설정할 수도 있다. 

 

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.METHOD)

@Documented

@Inherited

public @interface LoginCheck{

 

@Inherited

 

클래스 상속 관계에서 어노테이션을 상속받을 수 있는지 여부

이 어노테이션이 적용되면 하위클래스에서 상속된다.

 

@Documented

 

JavaDoc 문에서 문서화할 때 Annotation을 포함시킨다.

 

@Target

 

어노테이션을 어떤 요소에 적용할 것인지 지정

ex) 메소드로 지정되었으므로 메소드에만 적용가능하다

 

@Retention

 

어노테이션을 언제까지 유지할 것인지 지정

 

SOURCE: 컴파일 시점까지만 유지, 런타임시 정보 사용 불가

->컴파일러를 위한 정보나 코드 생성 도구에 사용

 

CLASS(default): 컴파일 ~ 런타임까지 유지, 런타임시 리플렉션(reflection)을 통해 어노테이션 정보를 얻을 수 없다. 

 

RUNTIME: 컴파일 ~ 런타임까지 유지, 리플렉션을 통해 어노테이션 정보를 얻을 수 있다. 

->런타임 동작에 영향을 주는 메타 데이터를 제공하는데 유용

 

@LoginCheck

@GetMapping("/user_logout_action")

public String user_logout_action(HttpSession session) {

session.removeAttribute("sUserId");

session.invalidate();

return "redirect:user_main";

}

@LoginCheck을 메소드에 적용하였다.

728x90

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

 

forEach태그

 

<c:forEach items="${guestList}" var="guest">

<tr>

<td width=50 align=center bgcolor="ffffff" height="20">${guest.guest_no}</td>

<td width=300 bgcolor="ffffff" style="padding-left:10"><a

href="guest_view?guest_no=${guest.guest_no}" class="user">${guest.guest_title}</a></td>

<td width=120 align=center bgcolor="ffffff">${guest.guest_date.substring(0,10)}</td>

</tr>

</c:forEach>

반복할 부분을 forEach태그로 감싼다.

items="순회할 List"

var="반복문에서 사용할 각 객체의 변수명"

 

if태그

<c:if test="${sUserId!=null}">

<s:message code="menu.id" arguments="${sUserId}"/>

</c:if>

test속성에 boolean 값을 반환할 수 있는 조건문을 입력한다. 

 

else, unless 태그는 없다. 

 

대신 choose 태그가 있다.

 

choose태그

 

이 태그는 when 태그를 사용해 if와 else if를 표현할 수 있다.

 

<c:choose>

      <c:when test="${empty sUserId }">

             <s:message code="menu.id" arguments="${sUserId}" />

      </c:when>

</c:choose>

choose 태그 안에 when 태그를 넣고 when 조건에 해당하면 태그 내의 코드를 수행한다.

'Java > Spring Boot' 카테고리의 다른 글

Thymeleaf in Spring  (0) 2023.09.14
Spring Interceptor  (0) 2023.09.14
Spring CustomTag SPEL(Spring Expression Language)  (0) 2023.09.13
Spring Boot Controller Type of Parameters  (0) 2023.09.13
Spring Boot DataSource 설정  (0) 2023.09.13
728x90

Spring에서 정의한 커스텀 태그 

 

기본적으로 el을 기초로 만들었기 때문에 el에서 할 수 있는 것은 대부분 할 수 있다. 

 

spel은 el은 못하는 생성자 호출을 하거나,  Spring Container에 등록된 bean 객체를 호출하여 사용할 수 있다는 장점이 있다.

 

<%@ taglib prefix="s" uri="http://www.springframework.org/tags"%>

태그 라이브러리를 import 한다. 

 

<s:eval expression="'KIM'.replace('K','N')"/>

s:eval 태그에 expression 속성에서 사용

 

문자열, 숫자, 논리형 리터럴을 사용할 수 있다.

문자열리터럴(SPEL):<s:eval expression="'KIM'.replace('K','N')"/> 

숫자리터럴(SPEL):<s:eval expression="12345+347834687"/>

논리리터럴(SPEL):<s:eval expression="true"/>

문자열에서는 String 의 메서드도 사용가능하고 

숫자는 연산도 처리한다.

 

request.setAttribute("price", 345345435);

request.setAttribute("user", new User("id", "password", "name"));

<s:eval expression="price"/> <!--345345435 출력-->

<s:eval expression="user.name"/><!--name 출력-->

변수, Bean 객체의 변수도 출력

 

<s:eval expression="${price}+3455"/> == <s:eval expression="price+3455"/>

el ${} 과 함께 사용할 수도 있다. 

 

<s:eval expression="new java.text.DecimalFormat('###,###.0').format(price)"/>

풀네임으로 생성자 호출도 가능하다

 

@Component("elBean")

public class SpringELBean {

private String member;

public SpringELBean() {

member="KIM";

}

 

public String printMembers() {

return member;

}

 

 

Component 어노테이션으로 elBean이라는 이름으로 Spring Container에 객체를 등록했다.

<s:eval expression="@elBean.member"/><br/>

<s:eval expression="@elBean.printMembers()"/><br/>

@componentName.memberField

 

bean 객체 앞에 @를 붙여주어야 한다.

 

 

'Java > Spring Boot' 카테고리의 다른 글

Spring Interceptor  (0) 2023.09.14
JSTL coreTag  (0) 2023.09.13
Spring Boot Controller Type of Parameters  (0) 2023.09.13
Spring Boot DataSource 설정  (0) 2023.09.13
Java WebAppInitConfig  (0) 2023.09.13
728x90

@Controller

public class 

 

@GetMapping("")

public String controllerParams(HttpServletRequest request,

HttpServletResponse response

, HttpSession session) {

 

}

HttpServletRequest: HTTP 요청 정보를 다루는 객체로, 클라이언트로부터 받은 요청에 대한 정보를 읽고 조작할 수 있습니다.

HttpServletResponse: HTTP 응답 정보를 다루는 객체로, 서버에서 클라이언트로 응답을 보낼 때 사용됩니다.

HttpSession: 클라이언트와 서버 간의 세션 관리를 위한 객체로, 세션 데이터를 저장하고 검색하는 데 사용됩니다

 

@GetMapping("")

public String controllerParams(WebRequest webRequest

, Locale locale

, InputStream is

, Reader reader

, OutputStream os

, Writer writer) {

locale.getCountry();

locale.getLanguage();

is.read();

}

WebRequest: Spring에서 제공하는 인터페이스로, HTTP 요청 및 응답을 다루는 데 사용됩니다.

Locale: 지역 및 언어 정보를 관리하는 객체로, 다국어 지원 기능에서 사용됩니다.

Reader, InputStream, OutputStream, Writer: 데이터의 입출력을 위한 스트림을 다루는 객체로, 파일 업로드 및 다른 I/O 작업에 사용됩니다.

 

@RequestMapping("")

public String controllerParams(@PathVariable("name") String name

, @RequestParam("name") String name1 

, @RequestParam(value="name", required=false, defaultValue="디폴트") String name2

, @RequestParam String name3 // 메서드 파라미터의 이름과 요청파라미터가 같다면 ("name") 생략가능

, String name4 // 메서드 파라미터의 이름과 요청파라미터가 같고 String, int등 단순한 타입의 경우 @RequestParam 생략가능

, @RequestParam Map<String, String> params) {

 

}

 

@PathVariable("name"): URL 경로 변수를 추출하기 위한 어노테이션으로, 경로에서 변수 값을 추출합니다.

(RequestMapping과 함께 사용됩니다.)

@RequestParam("name"): HTTP 요청 파라미터를 추출하기 위한 어노테이션으로, 요청 파라미터의 값을 추출합니다.

(name 파라메터가 없으면 400 오류 발생)

@RequestParam: 메서드 파라메터의 이름과 요청파라메터의 이름이 같다면 ("name")은 생략가능하다

(메서드 파라메터의 이름과 요청파라메터가 같고 String, int 등 단순한 타입의 경우 @RequestParam 생략 가능

@RequestParam(value="name", required=false, defaultValue="디폴트"): 요청 파라미터의 값을 추출하며, 필수 여부와 기본값을 설정할 수 있습니다.

@RequestParam Map<String, String>: 모든 요청 파라미터를 Map으로 수집합니다.

 

 

 

@GetMapping("")

public String controllerParams(@CookieValue("cookieName") String cookieName

, @CookieValue(value="cookieName", required=false, defaultValue="test") String cookieName1

, @RequestHeader("Host") String host // 값없으면 404 오류 발생

, @RequestHeader("Keep-Alive") long keepAlive) {

 

}

 

@CookieValue("cookieName"): 쿠키 값을 추출하기 위한 어노테이션으로, 쿠키의 값을 추출합니다.

(속성값이 없으면 404 오류 발생)

@CookieValue(value="cookieName", required=false, defaultValue="test"): 쿠키 값을 추출하며, 필수 여부와 기본값을 설정할 수 있습니다.

@RequestHeader(): HTTP 요청 헤더 값을 추출하기 위한 어노테이션으로, 헤더의 값을 추출합니다.

 

@GetMapping("")

public String controllerParams(ModelMap model

, Model model2

, Map map ) {

}

ModelMap, Model, Map: 뷰에 데이터를 전달하기 위한 모델 객체로, 뷰에서 사용할 데이터를 저장합니다.

 

@GetMapping("")

public String controllerParams(@ModelAttribute  User userModel

, @ModelAttribute("xxUser") User userModel2

, @ModelAttribute  User userModel3, BindingResult bindingResult

, @ModelAttribute  User userModel4, Errors errors) {

 

}

@ModelAttribute: 모델에 데이터를 바인딩하고 뷰에 전달하기 위한 어노테이션으로, 커맨드 객체를 생성하고 데이터를 바인딩합니다.

Errors, BindingResult: 데이터 바인딩 및 유효성 검사 결과를 저장하는 객체로, 데이터 바인딩 중 발생한 오류 정보를 관리합니다.

 

@GetMapping("")

public String controllerParams(SessionStatus sessionStatus) {

sessionStatus.setComplete();

sessionStatus.isComplete();

}

SessionStatus: 세션 상태를 관리하는 객체로, 세션을 완료하거나 초기화하는 데 사용됩니다.

 

@GetMapping("")

public String controllerParams(@RequestBody String body) {

 

}

 

@RequestBody: HTTP 요청 본문의 내용을 추출하기 위한 어노테이션으로, JSON 또는 XML과 같은 데이터를 읽어옵니다.

 

@GetMapping("")

public String controllerParams(@Value("#{commonprop['os.name']}") String osName ) {

 

}

 

@Value("#{commonprop['os.name']}") String osName: SpEL (Spring Expression Language)을 사용하여 프로퍼티 값을 주입하는 어노테이션으로, 외부 설정 파일에서 값을 가져올 때 사용됩니다.

 

'Java > Spring Boot' 카테고리의 다른 글

JSTL coreTag  (0) 2023.09.13
Spring CustomTag SPEL(Spring Expression Language)  (0) 2023.09.13
Spring Boot DataSource 설정  (0) 2023.09.13
Java WebAppInitConfig  (0) 2023.09.13
Spring Boot Request Controller  (0) 2023.09.13
728x90

@Config

ApplicationConfig

 

1. Spring의 Environment를 사용하여 속성 값에서 데이터베이스 연결 정보를 가져오는 방법

 

Environment는 application.properties 파일에서 값을 얻어온다.

@Autowired

Environment environment;

@Bean

public DataSource apacheDataSource() {

BasicDataSource dataSource=new BasicDataSource();

dataSource.setUrl(environment.getProperty("spring.datasource.url"));

dataSource.setUsername(environment.getProperty("spring.datasource.username"));

dataSource.setPassword(environment.getProperty("spring.datasource.password"));

return dataSource;

}

dataSource에 set url, username,password 를 할때,

environment에서 property를 가져온다. 

"spring.datasource.url"

 

2. 데이터베이스 연결 정보 하드코딩 

set 할때 DriverClassName을 포함하여 직접 연결정보를 입력해준다.

 

 

'Java > Spring Boot' 카테고리의 다른 글

Spring CustomTag SPEL(Spring Expression Language)  (0) 2023.09.13
Spring Boot Controller Type of Parameters  (0) 2023.09.13
Java WebAppInitConfig  (0) 2023.09.13
Spring Boot Request Controller  (0) 2023.09.13
Spring JSP 국제화  (0) 2023.09.13
728x90

자바클래스로 Spring 기본 설정할 때 사용된다.

 

-web.xml을 대신할 클래스로 톰캣 실행시 기본설정하는 역할을 한다.

 

WebAppInitConfig 클래스는 WebApplicationInitializer 인터페이스를 상속하여 

onStartup 메소드를 구현한다. 

 

onStartup 메소드는 톰캣 실행하자마자 실행되므로 설정의 역할을 하게 된다. 

이 메소드에서 dispatcherServlet도 등록하고 ApplicationConfig, Listener, WebConfig, encodingFilter도 설정할 수 있다. 

 

Spring에서 application.properties 파일로 설정을 하면 불필요한 액션인것 같다.

 

public class WebAppInitConf implements WebApplicationInitializer {

@Override

public void onStartup(ServletContext servletContext) throws ServletException {

/**********1.DispatcherServlet등록***************/

AnnotationConfigWebApplicationContext context =

new AnnotationConfigWebApplicationContext();

context.register(WebConfig.class);

ServletRegistration.Dynamic dynamic=

servletContext.addServlet("dispatcherSevlet", new DispatcherServlet(context));

dynamic.setLoadOnStartup(0);

dynamic.addMapping("/");

 

/********2.config 설정 클래스[ApplicationConfig.java,WebConfig.java]를사용한설정******/

//ApplicationConfig.java

AnnotationConfigWebApplicationContext applicationContext =

new AnnotationConfigWebApplicationContext();

applicationContext.register(ApplicationConfig.class);

//Listener등록

servletContext.addListener(new ContextLoaderListener(applicationContext));

//WebConfig.java

AnnotationConfigWebApplicationContext servletConfig = new AnnotationConfigWebApplicationContext();

servletConfig.register(WebConfig.class);

ServletRegistration.Dynamic dispatcherServlet = servletContext.addServlet("dispatcherServlet", new DispatcherServlet(servletConfig));

dispatcherServlet.setLoadOnStartup(1);

dispatcherServlet.addMapping("/");

//encodingFilter설정

FilterRegistration.Dynamic filterRegistration = servletContext.addFilter("encodingFilter", new CharacterEncodingFilter("UTF-8", true));

filterRegistration.addMappingForUrlPatterns(null, true, "/*");

}

}

'Java > Spring Boot' 카테고리의 다른 글

Spring Boot Controller Type of Parameters  (0) 2023.09.13
Spring Boot DataSource 설정  (0) 2023.09.13
Spring Boot Request Controller  (0) 2023.09.13
Spring JSP 국제화  (0) 2023.09.13
Spring Boot Controller Mapping + View Resolver  (0) 2023.09.12

+ Recent posts